C#中的私有内部类 – 为什么不经常使用?
我对C#比较陌生,每次开始编写C#项目时(我只用C#编写了几乎成熟的项目),我想知道为什么没有内部类?
也许我不明白他们的目标。 对我来说,内部类(至less是私人内部类)在Pascal / Modula-2 / Ada中看起来很像“内部过程”:它们允许在较小的部分中分解一个主类,以便于理解。
例如:这里是大部分时间看到的东西:
public class ClassA { public MethodA() { <some code> myObjectClassB.DoSomething(); // ClassB is only used by ClassA <some code> } } public class ClassB { public DoSomething() { } }
由于ClassB将被ClassA使用(至less一段时间),我的猜测是这个代码可以更好地expression如下:
public class ClassA { public MethodA() { <some code> myObjectClassB.DoSomething(); // Class B is only usable by ClassA <some code> } private class ClassB { public DoSomething() { } } }
我很高兴在这个问题上听到你的消息 – 对吗?
嵌套类(可能最好避免C#中的嵌套类“内在”与Java中的内部类有所不同)确实非常有用。
没有提到的一种模式是“更好的枚举”模式 – 它可以比Java更灵活:
public abstract class MyCleverEnum { public static readonly MyCleverEnum First = new FirstCleverEnum(); public static readonly MyCleverEnum Second = new SecondCleverEnum(); // Can only be called by this type *and nested types* private MyCleverEnum() { } public abstract void SomeMethod(); public abstract void AnotherMethod(); private class FirstCleverEnum : MyCleverEnum { public override void SomeMethod() { // First-specific behaviour here } public override void AnotherMethod() { // First-specific behaviour here } } private class SecondCleverEnum : MyCleverEnum { public override void SomeMethod() { // Second-specific behaviour here } public override void AnotherMethod() { // Second-specific behaviour here } } }
我们可以使用一些语言支持来自动执行一些操作,而且还有很多选项我没有在这里显示,比如没有为所有的值实际使用嵌套类,也没有为多个值使用相同的嵌套类,但给他们不同的构造参数。 但基本上,嵌套类可以调用私有构造函数的事实给了很多权力。
框架devise指南具有使用我迄今发现的嵌套类的最佳规则。
这是一个简短的总结列表:
当types和嵌套types之间的关系需要成员可访问性语义时,请使用嵌套types。
不要使用公共嵌套types作为逻辑组结构
避免使用公开暴露的嵌套types。
如果types可能在包含types之外被引用,则不要使用嵌套types。
如果需要通过客户端代码实例化,请勿使用嵌套types。
不要将嵌套types定义为接口的成员。
你应该限制每个类的责任,使每个类保持简单,可testing和可重用 。 私人的内部阶级不利于这一点。 它们促成了外部类的复杂性,它们不是可检验的,它们也不可重用。
对我个人而言,如果我需要创build可能需要方法的对象的进程中集合,我只创build私有内部类。
否则,可能会导致其他开发这个项目的开发人员感到困惑,因为他们不清楚他们在哪里。