sách gpt4 ăn đã đi

c# - 通过向下继承树在 C# 中输入“更宽松”

In lại 作者:太空狗 更新时间:2023-10-29 22:25:15 24 4
mua khóa gpt4 giày nike

我想问的问题是:

从抽象类内部向下继承树(即转向更专业的类)是否可以原谅,甚至是一件好事,还是它总是一个糟糕的选择,有更好的选择?

现在,举例说明为什么我认为它可以永久使用。

我最近实现了 Bencoding from the BitTorrent protocol在 C# 中。一个足够简单的问题,如何表示数据。我选择这样做,

我们有一个abstract BItem类,它提供了一些基本功能,包括用于将Bencoded字符串解码为必要结构的static BItem Decode(string) .

还有四个派生类,BStringBIntegerBListBDictionary,代表四种不同的被编码的数据类型。现在,这是棘手的部分。 BListBDictionary 分别有 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 文件中在那里。泛型不是要走的路,至少有这个问题:(。点击我链接的规范,它只有 4 个小点大。

câu trả lời hay nhất

我想我会让 this[int] 和 this[string] 访问器成为虚拟的,并在 BList/BDictionary 中覆盖它们。访问器没有意义的类应该转换 NotSupportedException()(可能通过在 BItem 中有一个默认实现)。

这使您的代码以相同的方式工作,并在您应该编写的情况下为您提供更具可读性的错误

 (BInteger)torrent["info"][0]["files"]["length"];

错误。

关于c# - 通过向下继承树在 C# 中输入“更宽松”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/81972/

24 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress