10

我在想,如果一个类只在另一个类中实例化,那么在该类中使用它是正确的。我认为这将有助于我们进行良好的设计。当我查看我的项目时,我几乎从未见过这样的嵌套结构。但是如果我尝试嵌套类,那么这次我脑海中会出现另一个问题。例如

我有 Board 类、Move 类,如 ShortCastle、LongCastle、EnPassant、Promote 和 Pawn、Queen、Rook、Knight 等棋子。所以很明显 Board 类将实例化 Piece 类,而 Piece 类将实例化 Move 类。对于一个好的设计,Promote move 类应该嵌套在 Pawn 中,因为只有 pawn 才能提升自己。短和长 Castles 应该嵌套在 King 中,因为只有 King 才能有这种类型的动作。

尝试将所有 Piece 类放入 Board 类看起来并不好设计,因为 8-9 类将在 Board 类中,并且它真的会烦人 Board 类文件太大且难以阅读。我更喜欢将每个 Piece 类保留在另一个文件。很好,我们可以创建部分 Board 类,但仍然不是很烦人 8-9 Partial Board 类文件将包含每个部分类?不让它们嵌套更好吗?Pieces 也一样 为另一个 Move 类型类创建另一个部分 Piece 文件?如果嵌套类只占用很小的空间,那么它不会有任何问题,但如果它需要很多方法?

4

5 回答 5

11

我认为你对嵌套类太慷慨了。看看这个嵌套类型的设计指南。

如果满足以下条件,请不要使用嵌套类型:

  • 该类型必须由客户端代码实例化。如果一个类型有一个公共构造函数,它可能不应该嵌套。该准则背后的基本原理是,如果可以实例化嵌套类型,则表明该类型在库中拥有自己的位置。您可以在不使用外部类型的情况下创建、使用和销毁它。因此,它不应该嵌套。如果与外部类型没有关系,内部类型不应在外部类型之外广泛重用。
  • 对类型的引用通常在客户端代码中声明。

这些作品可能属于一个董事会(作为成员的作品收藏?)但可以在没有它的情况下共存。你可能想重用没有棋子的棋盘(主题等),也想重用没有棋盘的棋子(位置等)。

于 2010-06-29T18:42:59.550 回答
2

Nexted Class 方法可以访问父类的私有成员。

Nexted 类允许在没有广泛范围的情况下降低复杂性。

于 2010-06-29T18:47:05.110 回答
1

为了一个好的设计,Promote move 类应该嵌套在 Pawn 中,因为只有 pawn 可以提升自己。

我真的不同意。仅仅因为你可以嵌套类并不意味着你应该。问问自己嵌套这些类有什么好处。

于 2010-06-29T21:13:01.953 回答
0

如果您真的,真的认为嵌套类对您的设计有意义(请参阅 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
    {

    }
}
于 2010-06-29T18:54:14.593 回答
0

嵌套类有它们的位置,但使用起来可能会令人困惑。我在http://www.virtualsecrets.com/graph-api-json-facebook-handler.html找到了一个网页,展示了如何使用一些 .Net 类来获取 Facebook 的墙贴的 JSON 输出。这里有趣的是类嵌套在类内部,在其他类内部——所以可以做到,只是有点复杂。:)

于 2012-06-20T12:19:33.843 回答