为什么嵌套类"继承"?

时间:2016-01-13 08:05:07

标签: c# .net inheritance nested-class

请考虑以下代码示例:

class Outer
{
    public class Nested { }
}

class SubOuter : Outer { }

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

看来嵌套类是"继承"由子类。其中的重点是什么?如果我不能(或不能轻易)做到这个功能,我该怎么办? Aren&#t; t Outer.NestedSubOuter.Nested完全相同?

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

2 个答案:

答案 0 :(得分:5)

Test Nested的角度来看,它只是一个标识符,好像它是一个成员,例如因为它是public您可以在任何可以访问任何类OuterSubOuter的地方访问它。然而,两种用法都是相同的,它们确定了相同的类别。

你甚至可以引用另一个:

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

甚至

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

但是,您可能会在调试器中看到xy共享对Outer.Nested的引用,而不是SubOuter.Nested

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

然而,不同地处理嵌套类将是一个新功能。

答案 1 :(得分:3)

由于Nested类是 public ,因此SubOuter类可以在基类中看到它。

你是对的。 Outer.NestedSubOuter.Nested是等价的,除了声明方式外,它们没有区别。

<强>更新

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

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

这是非常重要的解释,写在你的问题的评论中 @Damien_The_Unbeliever。

  

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