2011-05-16 32 views
1

请考虑以下接口:如何用接口ID之类的东西替换枚举?

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

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

+2

是什么让你认为你的枚举是多余的? – 2011-05-16 10:50:10

+0

@Abdul,只是因为接口类型映射到枚举值: IAudioFile => ContentType.Audio; IVideoFile => ContentType.Video – 2011-05-16 11:00:03

回答

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>(); 
} 
+0

好的,很好!但是如何获取有关支持的文件类型的信息(请参阅GetSupportedTypes)? – 2011-05-16 11:02:21

+0

嗯,在什么情况下你需要调用GetSupportedTypes? – 2011-05-16 12:23:41

+0

客户端应该有可能获得一组受支持的类型,然后逐个获取仅受支持的类型。 – 2011-05-16 12:34:41

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链时,您应该考虑将方法插入到已存在的类层次结构中或创建一个新的类。您应该努力编写看起来像您在第一个代码片段中看到的代码。

像往常一样,这是通用的,所以它可能不适用于您的特定问题。

0

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

如果你不喜欢,你可以创建一些重载像

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

对不起,但我没有提到过,文件的类层次结构可能会稍后增长。所以,我需要更灵活的机制。 – 2011-05-16 11:05:54