在this stackoverflow answer一位评论者提到“私有(private)嵌套类”可能非常有用,所以我在 articles such as this one 中阅读了有关它们的内容这往往会解释嵌套类的技术功能,但不会解释您要使用它们的原因。
我想我会为属于较大类的小助手类使用私有(private)嵌套类,但通常我需要来自另一个类的助手类,所以我只需要额外的努力(1)使嵌套类成为非嵌套类或(2)将其公开,然后使用其上的外部类前缀访问它,这似乎都是额外的工作,没有任何附加值,因为嵌套类在第一名。因此,总的来说,我真的没有看到嵌套类的用例,除了可能让类更有条理地分组,但我认为这也违背了单类-我喜欢的每个文件清晰度。
您通过哪些方式使用嵌套类来使您的代码更易于管理、更易读、更高效?
您已经回答了自己的问题。当你需要一个在类之外没有意义的辅助类时,使用嵌套类;特别是当嵌套类可以使用外部类的私有(private)实现细节时。
您关于嵌套类无用的论点也是私有(private)方法无用的论点:私有(private)方法可能在类外部有用,因此您必须将其设置为内部方法。内部方法可能在程序集之外有用,因此您可以将其公开。因此,所有方法都应该是公开的。如果您认为这是一个糟糕的论点,那么您对类而不是方法提出相同的论点有什么不同?
我一直在创建嵌套类,因为我经常需要将功能封装在一个在类外部没有意义的帮助器中,并且可以使用外部类的私有(private)实现细节。例如,我编写编译器。我最近写了一个 SemanticAnalyzer 类,它对解析树进行语义分析。它的嵌套类之一是 LocalScopeBuilder。当我不分析解析树的语义时,在什么情况下我需要构建本地作用域?绝不。该类完全是语义分析器的一个实现细节。我计划添加更多嵌套类,其名称如 NullableArithmeticAnalyzer 和 OverloadResolutionAnalyzer,它们在类之外也没有用,但我想在这些特定类中封装语言规则。
人们还使用嵌套类来构建诸如迭代器或比较器之类的东西——这些东西在类之外毫无意义,并通过众所周知的接口(interface)公开。
我经常使用的一种模式是拥有扩展其外部类的私有(private)嵌套类:
abstract public class BankAccount
{
private BankAccount() { }
// Now no one else can extend BankAccount because a derived class
// must be able to call a constructor, but all the constructors are
// private!
private sealed class ChequingAccount : BankAccount { ... }
public static BankAccount MakeChequingAccount() { return new ChequingAccount(); }
private sealed class SavingsAccount : BankAccount { ... }
等等。嵌套类与工厂模式配合得很好。这里的 BankAccount 是各种类型银行账户的工厂,所有这些都可以使用 BankAccount 的私有(private)实现细节。但是没有第三方可以创建自己的扩展 BankAccount 的类型 EvilBankAccount。