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.

Foi útil?

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top