【问题标题】:C# - Defining public nested classes: should we do it? [duplicate]C# - 定义公共嵌套类:我们应该这样做吗? [复制]
【发布时间】:2023-04-10 11:27:01
【问题描述】:

过去我一直避免定义嵌套类。但是,如果一个类只在初级类中使用,那么嵌套类是它的理想场所吗?有没有关于这个主题的公认约定?

public class PrimaryClass
{
    public class SubClass
    {
        // ...
    }

    public SubClass MySubClass { get; set; }
    // ...
}

还是应该一直这样

public class SubClass
{
    // ...
}

public class PrimaryClass
{
    public SubClass MySubClass { get; set; }
    // ...
}

【问题讨论】:

    标签: c# coding-style subclass


    【解决方案1】:

    你是完全正确的——如果子类只在主类中使用过,那么分离关注点是一个好习惯。在 Java 中,这是一种称为匿名内部类的语言级构造。如果需要,您可以随时重构子类。

    比较 C# 和 Java 的 wiki 文章有很好的分析,涵盖了一般准则和语言特定问题。 http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java#Inner_and_local_classes

    【讨论】:

    • 如果它们在这个例子中被命名,它们就不是匿名的,而只是“内部”类。匿名类是不包含“类名”声明的类。此外,如果标记为 public,则该类也可以从周围类外部访问。
    • @filip-fku 正确。正如我所提到的,在 Java 中,匿名内部类是一个 similar 构造。有几个重要的细微差别,尤其是在访问静态变量方面。
    • 但是在 Java 中,与此处演示的内容相比,“匿名内部”类更接近匹配 - 只是一个命名的内部/嵌套类。我认为在与 Java 概念进行比较时,如果您引用“内部类”而不是“匿名内部类”会更有帮助。匿名类在 Java 中既充当类声明又充当实例化,此处并非如此。
    【解决方案2】:

    如果内部类是其父外部类的内在部分,那么这样做是完全可以的。我看到一个内部类就像外部类的任何其他成员一样,除了它带有自己的一组方法和属性。

    例如,发动机是机动车辆的固有部件。它不能在一个人之外发挥作用(因此无意义),因此换句话说,它存在的意义完全取决于机动车辆。我当然在这里假设引擎不能存在于除机动车辆之外的任何其他事物中(想不出更好的例子,抱歉)。

    在 C# 中,您当然也可以将引擎实现为单独的类,并从机动车辆类中引用它。这真的是你的选择。

    【讨论】:

      【解决方案3】:

      除了仅在外部类中使用嵌套类之外,在某些情况下,您还希望将其实例交给外部世界。通常你使用接口来做到这一点。下面是一个如何使用嵌套类和接口的示例:

         public interface IDoSomething {...}
      
         public class Outer
         {
      
              public static IDoSomething GetSomethingToDo( ... parameters ...)
              { 
                  if (...) return new SomethingA();
                  else return new SomethingB();
              }
      
              private class SomethingA : IDoSomething { ...}
              private class SomethingB : IDoSomething { ...}
      
          }
      

      DoSomething 的实现对外界完全隐藏。

      【讨论】:

        【解决方案4】:

        我倾向于只将嵌套类定义为私有的,而不是公共的。这样,嵌套类将仅由封闭类使用。只有当嵌套类被多个顶级类使用时,我才会将该类移动到顶级。然后我通常把它放在内部。

        应为枚举保留使用公共嵌套类。

        【讨论】:

          猜你喜欢
          • 2014-03-14
          • 1970-01-01
          • 1970-01-01
          • 2014-08-30
          • 2017-10-08
          • 1970-01-01
          • 1970-01-01
          • 2010-09-05
          • 2018-08-02
          相关资源
          最近更新 更多