我想問的問題在C#「寬鬆」打字是這樣的:鑄造沿着繼承樹
從一個抽象類情有可原內鑄造沿着繼承樹(即朝着更specialiased類)。甚至是一件好事,還是總是一個可憐的選擇,有更好的選擇?
現在,爲什麼我認爲它可以用於良好的例子。
我最近在C#中實現了Bencoding from the BitTorrent protocol。一個足夠簡單的問題,如何表示數據。我選擇這樣做,
我們有一個abstract BItem
類,它提供了一些基本功能,包括用於將Bencoded字符串解碼爲必要結構的static BItem Decode(string)
。
還有四個派生類,BString
,BInteger
,BList
和BDictionary
,表示待編碼的四個不同的數據類型。現在,這是棘手的部分。 BList
和BDictionary
分別具有this[int]
和this[string]
訪問器以允許訪問這些數據類型的類似數組的質量。
潛在的可怕的部分現在快到:
BDictionary torrent = (BDictionary) BItem.DecodeFile("my.torrent");
int filelength = (BInteger)((BDictionary)((BList)((BDictionary)
torrent["info"])["files"])[0])["length"];
那麼,你得到的圖片...哎喲,這是很難的眼睛,更不用說大腦。所以,我介紹了一些額外的成抽象類:
public BItem this[int index]
{
get { return ((BList)this)[index]; }
}
public BItem this[string index]
{
get { return ((BDictionary)this)[index]; }
}
現在,我們可以把舊的代碼爲:
BDictionary torrent = (BDictionary)BItem.DecodeFile("my.torrent");
int filelength = (BInteger)torrent["info"]["files"][0]["length"];
哇,變戲法似的,更可讀的代碼。但是,我是否僅僅爲了暗示子類的知識而將部分靈魂出售給抽象類?
編輯:在回答一些進來的答案,你完全偏離軌道了這個特殊的問題,因爲結構是可變的,例如我的torrent["info"]["files"][0]["length"]
例子是有效的,但這樣是torrent["announce-list"][0][0]
,都將是在90%的torrent文件中。泛型是不是要走的路,與這個問題atleast :(。點擊通過規範我鏈接,它只有4個小點的大點。
我震驚了! :) – 2008-09-17 10:58:30