¿Cómo reemplazar la enumeración con algo como ID de interfaz?
-
14-11-2019 - |
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.
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();