Как заменить перечисление чем-то вроде идентификатора интерфейса? - PullRequest
1 голос
/ 16 мая 2011

Пожалуйста, обратите внимание на следующие интерфейсы:

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);
};

Я думаю, что перечисление ContentType является избыточным. Есть ли способ использовать что-то вроде идентификатора интерфейса вместо типа перечисления?

Любые комментарии по дизайну интерфейса приветствуются.

Ответы [ 3 ]

3 голосов
/ 16 мая 2011

Это действительно зависит от того, чего вы пытаетесь достичь, но я могу рассмотреть один из вариантов - использование универсальных шаблонов, чтобы IProvider был таким же, как

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

, который можно реализовать так

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

    }
}

и называется так

public void Caller()
{
    var files = GetFiles<IAudioFile>();
} 
0 голосов
/ 16 мая 2011

Я думаю, что дело здесь в том, что возвращаемый список содержит «базовые» объекты.

Если вам это не нравится, вы можете создать некоторые перегрузки, такие как

IList<IAudioFile> GetAudioFiles();
IList<IVideoFile> GetVideoFiles();
0 голосов
/ 16 мая 2011

Обычно лучше написать что-то вроде этого:

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

чем

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

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

Это потому, что переключатели обычно становятся кошмаром обслуживания с течением времени, и это также подвержено ошибкам.

Моя рекомендация заключается в том, что когда вам нужны цепочки switches или if-else, вам следует рассмотреть возможность добавления метода в уже существующую иерархию классов или создания новой. Вы должны стремиться писать код, похожий на тот, который вы видите в первом фрагменте кода.

Как обычно, это общее, поэтому оно может не относиться к вашей конкретной проблеме.

...