如何用接口 ID 之类的东西替换枚举?
-
14-11-2019 - |
题
请考虑以下接口:
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 枚举是多余的。有没有办法使用接口标识符之类的东西来代替枚举类型?
非常感谢对界面设计的任何评论。
解决方案
它真的取决于你想要完成的东西,但是我可能想要查看的一个选项是使用泛型,因此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>();
}
. 其他提示
通常,最好这样写:
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
您应该考虑将方法插入到现有的类层次结构中或创建一个新的方法。您应该努力编写与第一个代码片段中看到的代码类似的代码。
与往常一样,这是通用的,因此可能不适用于您当前的特定问题。
我认为这一点是返回的列表包含“基础”对象。
如果您不喜欢,您可以创建一些超载(如)
IList<IAudioFile> GetAudioFiles();
IList<IVideoFile> GetVideoFiles();
. 不隶属于 StackOverflow