Why are inaccessible members considered inherited?
C规范规定:
The declared accessibility of a base class member does not control
whether the member is inherited--inheritance extends to any member
that isn't an instance constructor,static constructor,or destructor.
However, an inherited member may not be accessible in a derived type,
either because of its declared accessibility or because it is hidden
by a declaration in the type itself.
号
为什么不可访问的成员被认为是继承的?为什么要这样区分?
作为一个具体的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 } |
在我看来,在运行时继承意味着共享状态和/或行为。在
是否继承
在您的例子中,您所说的是
如果这是一个私有实例变量,那么它将是从
(可能有必要弄清楚你对静态部分还是私有部分感兴趣;它们有些正交。)
这篇文章可能对您有所帮助。
Inheritance and representation
Why is an inaccessible member considered inherited? Why is such a distinction made/practical?
号
最好问一个相反的问题:为什么制定一个规则说不可访问的成员不是继承的呢?让我们考虑一下这样一条规则的后果。
首先,如果你有
1 2 3 4 5 6 7 | class B { internal int x; } class D1 : B {} // in another assembly class D2 : B {} |
号
你会说x是由d1继承的,而不是由d2继承的?这看起来很奇怪。或者这个案子怎么样:
1 2 3 4 5 6 | class B { private int x; private class D1 : B {} } class D2 : B {} |
同样,你会说x是由d1继承的,而不是由d2继承的?
在每一种情况下,派生类都有一个整型字段x,但您会仅仅基于在某些源代码位置中不能通过名称访问该字段而否认这一事实吗?把"继承"的定义与"可访问"的定义联系起来,有什么令人信服的价值呢?
简单地使这两个概念正交就容易多了。""继承的"表示"基类型的此成员也是派生类型的成员"。可访问性是指访问源代码是否在声明成员的可访问性域内。他们之间没有什么关系,所以我们不要不必要地把他们混为一谈。
通过演示最容易解释这一点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class Parent { private int value; public virtual int GetValue() { return value; } } public class Child : Parent { public int GetOtherValue() { //"value" is no accessible in this scope return GetValue() + 1; } } |
创建对象时,会为该类型的所有实例字段分配内存。