【问题标题】: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 文件?如果嵌套类只占用很小的空间,那么它不会有任何问题,但如果它需要很多方法?

【问题讨论】:

    标签: c# .net nested-class


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

          【讨论】:

          • 据我了解,这篇文章不是关于嵌套类,它只是嵌套对象。这是完全不同的。
          猜你喜欢
          • 2015-11-20
          • 1970-01-01
          • 2014-01-13
          • 1970-01-01
          • 2022-11-17
          • 1970-01-01
          • 2020-08-30
          • 2021-09-01
          • 2012-03-26
          相关资源
          最近更新 更多