1

请考虑以下接口:

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 枚举是多余的。有没有办法使用接口标识符而不是枚举类型?

非常感谢对界面设计的任何评论。

4

3 回答 3

3

这实际上取决于您要完成的工作,但是您可能想要查看的一个选项是使用泛型,因此 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>();
} 
于 2011-05-16T10:57:38.593 回答
0

通常,最好这样写:

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

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

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

这是因为随着时间的推移,交换机通常会成为维护的噩梦,而且它也容易出错。

我的建议是,当您需要switchesif-else链接时,您应该考虑将方法插入到已经存在的类层次结构中或创建一个新方法。您应该努力编写与您在第一个代码片段中看到的代码相似的代码。

像往常一样,这是通用的,因此它可能不适用于您手头的特定问题。

于 2011-05-16T10:58:58.133 回答
0

我认为这里的重点是返回的列表包含“基础”对象。

如果你不喜欢这样,你可以创建一些重载,比如

IList<IAudioFile> GetAudioFiles();
IList<IVideoFile> GetVideoFiles();
于 2011-05-16T10:59:49.950 回答