在哪里以及如何使用嵌套类? [复制]

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 输出的网页,这里有趣的是类嵌套在类内部,在其他类内部 - 所以可以做到,只是有点复杂。 :)

【讨论】:

据我了解,这篇文章不是关于嵌套类,它只是嵌套对象。这是完全不同的。

以上是关于在哪里以及如何使用嵌套类? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在哪里以及如何找到 Android 类使用的布局文件?

如何使用嵌套的类名? [复制]

如何在 Sass 中嵌套类? [复制]

我如何以及在哪里使用来自 Apollo 客户端的数据?

在客户端存储 JWT 令牌的位置以及如何保护它? [复制]

关键字“new”是如何工作的,尤其是当我启动静态嵌套类时? [复制]