在哪里以及如何使用嵌套类? [复制]
Posted
技术标签:
【中文标题】在哪里以及如何使用嵌套类? [复制]【英文标题】:Where and how to use nested classes? [duplicate] 【发布时间】:2010-06-29 18:33:33 【问题描述】:我在想,如果一个类只在另一个类中实例化,那么在该类中使用它是正确的。我认为这将有助于我们进行良好的设计。当我查看我的项目时,我几乎从未见过这样嵌套结构。但是如果我尝试嵌套类,那么这次我脑海中会出现另一个问题。例如
我有 Board 类,Move 类,如 ShortCastle、LongCastle、EnPassant、Promote 和 Pieces,如 Pawn、Queen、Rook、Knight 等。所以很明显,Board 类将实例化 Piece 类,而 Piece 类将实例化 Move 类。为了一个好的设计,Promote move 类应该嵌套在 Pawn 中,因为只有 pawn 可以提升自己。short 和 long Castles 应该嵌套在 King 中,因为只有 king 才能有这种类型的动作。
试图将所有 Piece 类放到 Board 类中看起来不是很好的设计,因为 8-9 类将在 Board 类中,并且真的很烦人 Board 类文件太大且难以阅读。我更喜欢保留每一块另一个文件中的类。很好,我们可以创建部分 Board 类,但仍然不是很烦人 8-9 Partial Board 类文件将包含每个部分类?不让它们嵌套更好吗? Pieces 也一样 为另一个 Move 类型类创建另一个部分 Piece 文件?如果嵌套类只占用很小的空间,那么它不会有任何问题,但如果它需要很多方法?
【问题讨论】:
【参考方案1】:我认为你对嵌套类太慷慨了。 查看 this 嵌套类型的设计指南。
如果满足以下条件,请不要使用嵌套类型:
该类型必须由 客户端代码。如果一个类型有一个公共 构造函数,它可能不应该 被嵌套。这背后的理由 准则是,如果嵌套类型 可以实例化,它表示 该类型在 图书馆自己。你可以创建 它,使用它,并在没有的情况下摧毁它 使用外部类型。因此,它 不应该嵌套。内型 不应该在外面广泛重复使用 没有a的外部类型 与外部类型的关系。 对类型的引用通常是 在客户端代码中声明。这些作品可能属于一个董事会(作为成员的作品收藏?)但可以在没有它的情况下共存。你可能会觉得想重用没有棋子的棋盘(主题等),也想重用没有棋盘的棋子(位置等)。
【讨论】:
【参考方案2】:Nexted Class 方法可以访问父类的私有成员。
Nexted 类允许在没有广泛范围的情况下降低复杂性。
【讨论】:
【参考方案3】:为了一个好的设计,Promote move 类应该嵌套在 Pawn 中,因为只有 pawn 可以提升自己。
我真的不同意。仅仅因为你可以嵌套类并不意味着你应该。问问自己嵌套这些类有什么好处。
【讨论】:
你限制了这个设计出错的可能性。没有其他棋子不能创造这样的动作,即使是错误的。这个设计不允许它。我错了吗? 深度嵌套类限制了它们的范围(在某些情况下这可能是一个有用的架构约束),但是您在项目的早期就承担了很多复杂性。我建议做“可以工作的最简单的事情”,然后在需要时重构为更复杂的设计。稍后,如果您想限制可以从哪里实例化某些类,您可以将解决方案分解为不同的程序集(通过创建“类库”项目)。祝你好运! =)【参考方案4】:如果您真的认为嵌套类对您的设计有意义(参见 Tim Schmelter 的告诫),但又觉得文件太大,那么使用部分类可以将嵌套类定义拆分到它们自己的文件中。或者,如果嵌套类本身足够小,但您有大量嵌套类,则将所有嵌套类放入一个部分文件中。
父.cs:
public partial class Parent
void SomeMethod()
Nested1 n1 = new Nested1();
Nested2 n2 = new Nested2();
嵌套.cs:
public partial class Parent
private class Nested1
private class Nested2
【讨论】:
【参考方案5】:嵌套类有其一席之地,但使用起来可能会令人困惑。我在http://www.virtualsecrets.com/graph-api-json-facebook-handler.html 找到了一个展示如何使用一些 .Net 类来获取 Facebook 的墙贴的 JSON 输出的网页,这里有趣的是类嵌套在类内部,在其他类内部 - 所以可以做到,只是有点复杂。 :)
【讨论】:
据我了解,这篇文章不是关于嵌套类,它只是嵌套对象。这是完全不同的。以上是关于在哪里以及如何使用嵌套类? [复制]的主要内容,如果未能解决你的问题,请参考以下文章