Pregunta

Considere las siguientes interfaces:

interface IFile
{
    // Members
};

interface IAudioFile : IFile
{
    // Members
};

interface IVideoFile : IFile
{
    // Members  
};

enum ContentType
{
    Audio,
    Video
};

interface IProvider
{
    HashSet<ContentType> GetSupportedTypes();
    IList<IFile> GetFiles(ContentType contentType);
};

Creo que la enumeración ContentType es redundante.¿Hay alguna forma de utilizar algo como un identificador de interfaz en lugar de un tipo de enumeración?

Cualquier comentario sobre el diseño de la interfaz es muy apreciado.

¿Fue útil?

Solución

Realmente depende de lo que está tratando de lograr, pero una opciones que quizás quiera mirar está usando genéricos, para que iProvider sea tan

interface IProvider
{
    IList<IFile> GetFiles<T>() where T: IFile;
}

que se puede implementar así

public void ProviderConcrete()
{
    public IList<IFile> GetFiles<T>()
    {
        if(typeof(t) == typeof(IAudioFile))
            .... get Audio files

    }
}

y se llama así

public void Caller()
{
    var files = GetFiles<IAudioFile>();
} 

Otros consejos

Normalmente, es mejor escribir algo como esto:

void method(IFile file) {
    file.DoYourThing();
}

que

void method(ContentType id) {
   switch (id) {
   case ContentType.Audio: 
       file.DoThis();
       break;

   case ContentType.Video: 
       file.DoThat();
       break;
   }
}

Eso es porque los interruptores generalmente se convierte en una pesadilla de mantenimiento a medida que pasa el tiempo y también es propenso a errores.

Mi recomendación es que cuando necesites switches o if-else cadenas que debería considerar para insertar un método en una jerarquía de clases ya existente o crear una nueva.Debe esforzarse por escribir un código que se parezca al que ve en el primer fragmento de código.

Como de costumbre, esto es genérico, por lo que es posible que no se aplique a su problema particular.

Creo que el punto aquí es que la lista devuelta contiene objetos "base".

Si no te gusta, podrías crear algunas sobrecargas como

IList<IAudioFile> GetAudioFiles();
IList<IVideoFile> GetVideoFiles();

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top