【问题标题】:How to replace enumeration with something like interface ID?如何用接口ID之类的东西替换枚举?
【发布时间】:2011-05-16 10:44:20
【问题描述】:

请考虑以下接口:

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

任何关于界面设计的cmets都非常感谢。

【问题讨论】:

  • 是什么让你认为你的枚举是多余的?
  • @Abdul,只是因为接口类型映射到枚举值:IAudioFile => ContentType.Audio; IVideoFile => ContentType.Video

标签: c# enumeration interface-design


【解决方案1】:

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

【讨论】:

  • 好的,很好!但是如何获取有关支持的文件类型的信息(请参阅 GetSupportedTypes)?
  • 嗯,什么情况下需要调用GetSupportedTypes?
  • 客户端应该有可能获得一组支持的类型,然后只获得一个支持的类型。
  • 你可以硬编码这个方法来返回一个类型列表,但是你可能有一天会忘记更新它并繁荣。另一种选择是使用反射来遍历程序集中的所有类型并挑选出实现 IFile 的类型
  • 对汇编中的所有类型进行迭代是解决此类问题的最佳实践吗?
【解决方案2】:

通常,最好这样写:

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 链时,您应该考虑将方法插入到现有的类层次结构中或创建一个新方法。您应该努力编写与您在第一个代码 sn-p 中看到的代码相似的代码。

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

【讨论】:

    【解决方案3】:

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

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

    IList<IAudioFile> GetAudioFiles();
    IList<IVideoFile> GetVideoFiles();
    

    【讨论】:

    • 抱歉,我没有提到文件的类层次结构以后可能会增长。所以,我需要更灵活的机制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    相关资源
    最近更新 更多