为什么嵌套类";“继承”;

本文关键字:继承 quot 嵌套 为什么 | 更新日期: 2023-09-27 18:30:02

考虑以下代码示例:

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的引用。

编辑:正如其他已经提到的,这是没有新的功能,它只是对类中成员的常见处理。因此,它肯定不会给语言带来任何好处,因为你所描述的功能根本不存在。因此,这遵循了最小惊奇的原则。

然而,区别对待嵌套类将是一个新特性。

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

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

更新

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

您可以像基类中的任何其他属性一样考虑Nested类。

这是一个非常重要的解释,由@Damien_The_Unbeliever。

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