[英]How to replace enumeration with something like interface 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枚舉是多余的。 有什么辦法可以使用接口標識符之類的東西來代替枚舉類型嗎?
非常感謝您對界面設計的任何評論。
這實際上取決於您要完成的工作,但是我可能要看的一個選擇是使用泛型,因此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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.