CS0060的起源是什么:类类型的直接基类必须至少与类类型本身一样可访问

moh*_*eeh -1 .net c# language-specifications

我刚刚在.net中遇到了关于继承的这个基本规则:
CS0060:类类型的直接基类必须至少与类类型本身一样可访问

我很好奇为什么要制定这条规则.

有谁知道为什么这种继承是首选?是否有任何语言以不同的方式执行.


    // CS0060.cs
class MyClass
// try the following line instead
// public class MyClass
{
}

public class MyClass2 : MyClass   // CS0060
{
   public static void Main()
   {
   }
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Eri*_*ert 5

我很好奇为什么要制定这条规则.有谁知道为什么这种继承是首选?是否有任何语言以不同的方式进行?

第二个问题比第一个问题更容易回答.是的,其他语言的表现不同.特别是,C++允许" 私有继承 "; 也就是说,继承关系成为类的私有实现细节.如果C#具有私有继承,那么显然基类可能比派生类更难访问.但是C#没有私有继承.

第一个问题很难回答,因为"为什么"问题本质上不适合Stack Overflow.唯一正确的答案是"为什么这条规则得到了发展?" 是因为语言设计委员会在给出许多竞争性设计目标时决定这是最好的妥协".

这可能不是一个令人满意的答案.正确回答这个问题不仅涉及列出所有这些设计目标及其相对优点,还涉及在做出决定时描述设计团队中每个成员的心理状态,并且还描述了各种冲突的过程.出现了解决了.这个决定是在十三年前做出的,所以这条路线确实很冷.

十三年前那天我不在那个房间,但我可以让你知道设计委员会在决定是否允许私人继承时会考虑的因素:

  • 对"概念计数"的影响.(为了正确使用该功能,用户需要了解多少相关概念?该功能为该语言添加了多少个新概念?)
  • 功能与C++的相似性或不相似性,可能有用也可能令人困惑.
  • C++中功能的成功.人们在C++中使用它吗?他们正确使用它吗?每个C++用户是否都能很好地理解这个功能以做出不错的选择?
  • 与其他语言功能的交互量.这样的功能会以潜在的微妙或混乱的方式改变名称查找和重载解析.
  • 与相关语言功能的一致性水平.(允许接口不太容易访问.)
  • 难以实施.
  • 还有更多因素.

由于我没有三四个小时的时间,我需要为这个功能写出所有这些因素的详细分析,然后尝试追溯精神分析设计团队,我想你会有与你的好奇心生活在一起.

我建议将来不要在StackOverflow上提出这样的问题.尝试坚持有关具有精确答案的实际代码的特定技术问题.