我想问的问题在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