【问题标题】:Why are nested classes "inherited"?为什么嵌套类“继承”?
【发布时间】:2016-01-13 08:05:07
【问题描述】:

考虑以下代码示例:

class Outer
{
    public class Nested { }
}

class SubOuter : Outer { }

class Test
{
    Test()
    {
        Outer.Nested x;     // Makes sense.
        SubOuter.Nested y;  // Compiles, but why?
    }
}

嵌套类似乎是由子类“继承”的。那有什么意义呢?我可以用这个我不能(或不能轻易)做的功能做什么? Outer.Nested 和 SubOuter.Nested 不完全等价吗?

澄清:它当然可以编译,因为 C# 规范是这么说的。我明白那个。我在问为什么 C# 是这样设计的,因为它似乎没有向语言添加 东西。如果您有相反的示例,即使用此功能变得更容易/更短/更好的代码,请在答案中分享,我很乐意接受。

【问题讨论】:

  • 因为Nested是公开的,所以SubOuter类可以在基类中看到。
  • 问题出在哪里,为什么不想编译。
  • Outer.Nested 和SubOuter.Nested 是等价的,除了声明的方式外没有区别。
  • 不,您是在 要求 一项新功能。基类的所有公共成员都可以通过继承类访问。为什么 classes 应该被区别对待,例如方法,为什么编译器团队必须专门添加代码来防止您进行此类访问? (然后将错误消息翻译成各种语言,记录下来等)
  • 它更接近于“不继承类的公共非实例成员将完全违背人们的期望。”。至少这是我所期望的。除此之外,它可能还会有相当大的实施成本。

标签: c# .net inheritance nested-class


【解决方案1】:

从Test 的角度来看,Nested 只是一个标识符,就好像它是一个成员,例如因为它是public,您可以在任何无法访问Outer 或SubOuter 的类的地方访问它。但是这两种用法是相同的,它们标识的是同一个类。

您甚至可以一个接一个地引用:

Outer.Nested x = new Outer.Nested(); 
SubOuter.Nested y = x;

甚至

Outer.Nested x = new SubOuter.Nested();
SubOuter.Nested y = x;

但是,正如您在调试器中看到的那样,x 和 y 共享对 Outer.Nested 的引用,而不是 SubOuter.Nested。

编辑:正如其他已经提到的,这是没有新的功能,它只是对类内成员的通常处理。因此,它肯定不会为语言增加任何好处,因为您描述的功能根本不存在。因此,这遵循Principle of least astonishment。

但是,以不同的方式处理嵌套类将是一项新功能。

【讨论】:

    【解决方案2】:

    因为Nested类是public的,所以SubOuter类可以在基类中看到。

    你是对的。 Outer.Nested 和SubOuter.Nested 是等价的,除了声明方式没有区别。

    更新

    根据您的评论,这些功能是有成本的。 此功能已在 .NET 中实现(我的意思是子类可以看到基类的公共和受保护成员) 所以没有额外的成本来实现这是 .NET。

    您可以将嵌套类视为基类中的任何其他属性。

    这是非常重要的,请解释在您的问题上写在 cmets 中的哪个 @Damien_The_Unbeliever。

    不,您要求的是新功能。基类的所有公共成员都可以通过继承类访问。为什么类的处理方式与例如不同?方法,为什么编译器团队必须专门添加代码以防止您进行此类访问? (然后将错误消息翻译成各种语言,记录下来等)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      相关资源
      最近更新 更多