C#规范说明:
声明的基类成员可访问性不控制成员是否被继承 - 继承扩展到任何不是实例构造函数,静态构造函数或析构函数的成员.但是,可能无法在派生类型中访问继承的成员,因为它声明了可访问性,或者因为它在类型本身中被声明隐藏.
为什么一个无法访问的成员被认为是继承的?为什么这样的区别是实际的?
作为一个具体的例子
class A
{
const string foo = "c";
internal void DoWork() { }
}
class B: A
{
const string bar = "d";//renamed to foo does not appear to have a noticeable impact
B() { bar = foo; }//inaccessible due to protection level
internal new void DoWork() { }//hide inherited member
}
Run Code Online (Sandbox Code Playgroud)
在我看来,在运行时继承意味着共享状态和/或行为.在这种情况下foo不会发生.
它取决于B是否继承行为DoWork().因此,DoWork()作为一个成员B是直观和相关的.另一方面,为什么被foo视为会员B? B无法读取或写入foo.
在你的情况下,你在谈论const,这是隐含的静态.无论如何,静态成员实际上不会被继承.刚刚检查了规范,这意味着静态成员是继承的 - 但由于它们不代表状态而不能成为多态的一部分,因此它至少是一种"不同"的继承.我认为静态成员仅仅是"通过简单名称可用"到派生类,假设它们完全可访问 - 换句话说,它与名称解析相比,而不是真正的继承.
如果这是一个私有实例变量,那么这将是衍生自任何类型的实例的任何实例的状态的一部分A,所以它会被继承的状态.如果你考虑一个对象的状态和行为被继承,那么在我看来这是有道理的.
(可能值得清楚的是你是否对静态部分或私有部分感兴趣;它们有点正交.)
本文可能对您有所帮助.
http://ericlippert.com/2011/09/19/inheritance-and-representation/
为什么一个无法访问的成员被认为是继承的?为什么这样的区别是实际的?
最好问一个相反的问题:为什么制定一条规则说难以接近的成员不是继承的呢?让我们考虑这样一条规则的后果.
首先,如果你有
class B
{
internal int x;
}
class D1 : B {}
// in another assembly
class D2 : B {}
Run Code Online (Sandbox Code Playgroud)
你会说x是由D1继承而不是由D2继承?这看起来很奇怪.或者这个案例怎么样:
class B
{
private int x;
private class D1 : B {}
}
class D2 : B {}
Run Code Online (Sandbox Code Playgroud)
再说一次,你会说x是由D1继承而不是由D2继承?
在每种情况下,派生类都有一个整数字段x,但你只是因为在某些源代码位置无法通过名称访问字段而拒绝这一事实?将"继承"的定义与"可访问"的定义联系起来,有什么吸引人的价值?
简单地使两个概念正交是容易得多的."Inherited"表示"基类型的此成员也是派生类型的成员".可访问性是访问源代码是否在声明成员的可访问域内的问题.他们彼此没什么关系,所以不要让他们不必要地混淆.