为什么嵌套类“继承”?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么嵌套类“继承”?相关的知识,希望对你有一定的参考价值。

请考虑以下代码示例:

class Outer
{
    public class Nested { }
}

class SubOuter : Outer { }

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

似乎嵌套类是由子类“继承”的。那是什么意思?如果我不能(或不能轻易)做到这个功能,我该怎么办?不是Outer.NestedSubOuter.Nested完全相同吗?

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

答案

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

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

另一答案

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

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

更新

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

你可以像基类中的任何其他属性一样考虑嵌套类。

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

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

以上是关于为什么嵌套类“继承”?的主要内容,如果未能解决你的问题,请参考以下文章

Java嵌套类的作用、用法和调用机制是怎么样的?

嵌套类继承错误

这个嵌套类构造函数片段可以应用于泛型类吗?

访问嵌套片段的文本字段

C# 嵌套类和继承

从一个嵌套类继承到另一个嵌套类时出错