Como substituir a enumeração com algo como ID de interface?
-
14-11-2019 - |
Pergunta
Por favor, considere as seguintes 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);
};
Eu acho que ContentType enumeração é redundante.Existe alguma maneira de usar algo como o identificador de interface em vez do tipo de enumeração?
Quaisquer comentários sobre o design da interface são muito apreciados.
Solução
Ela realmente depende do que você está tentando realizar, mas eu opções que você pode querer olhar é o uso genéricos, de modo que IProvider é assim
interface IProvider
{
IList<IFile> GetFiles<T>() where T: IFile;
}
o que pode ser implementado da seguinte forma
public void ProviderConcrete()
{
public IList<IFile> GetFiles<T>()
{
if(typeof(t) == typeof(IAudioFile))
.... get Audio files
}
}
e chamado assim
public void Caller()
{
var files = GetFiles<IAudioFile>();
}
Outras dicas
Geralmente, é melhor escrever algo como isto:
void method(IFile file) {
file.DoYourThing();
}
de
void method(ContentType id) {
switch (id) {
case ContentType.Audio:
file.DoThis();
break;
case ContentType.Video:
file.DoThat();
break;
}
}
Isso porque muda normalmente tornar-se a manutenção de um pesadelo, como o tempo passa, e é propensa a erros também.
Minha recomendação é que, quando você precisa switches
ou if-else
correntes que você deve considerar para inserir um método para uma já existente hierarquia de classe ou criar um novo.Você deve se esforçar para escrever código que se parecem com o que você vê no primeiro trecho de código.
Como de costume, este é genérico, portanto, podem não se aplicar ao seu problema particular na mão.
Eu acho que o ponto aqui é que a lista retornada contém "base" de objetos.
Se você não gostar, você poderia criar algumas sobrecargas, como
IList<IAudioFile> GetAudioFiles();
IList<IVideoFile> GetVideoFiles();