刚刚看到一个教程说:
Class Dog
{
private string Name;
}
Class SuperDog:Dog
{
private string Mood;
}
接下来有一个 UML 显示 SuperDog 也将继承 Name。我尝试过,但似乎只有公共成员被继承。除非声明为公共,否则我无法访问 Name。
刚刚看到一个教程说:
Class Dog
{
private string Name;
}
Class SuperDog:Dog
{
private string Mood;
}
接下来有一个 UML 显示 SuperDog 也将继承 Name。我尝试过,但似乎只有公共成员被继承。除非声明为公共,否则我无法访问 Name。
derivedType.GetField("f", BindingFlags.Instance | BindingFlags.NonPublic)
从派生类中提取私有字段,则无法获得任何返回值,即使技术上应该返回所有继承成员。因此,即使它在技术上必须存在,但在底层中,所有相关部分都将其视为实际上不存在。 - Aaronaught在继承上下文中有各种级别的成员访问权限。
public
: 基类的所有公共成员在派生类中和派生类的实例中都可以访问。
protected
: 基类的所有受保护成员在派生类中可以访问但不能在派生类的实例中访问。
protected internal
: 基类的所有受保护且内部的成员在派生类中和在同一程序集中创建的派生类实例中都可以访问。
internal
: 基类的所有内部成员在派生类中和在同一程序集中创建的派生类实例中都可以访问。
private
: 基类的所有私有成员在派生类中和在派生类的实例中都不可访问。
private protected
: 类型或成员只能在声明它的程序集中访问,由该类或从该类派生的类型中的代码所访问。
protected internal
的措辞有误。protected internal
基类成员可见于所有派生类,并且暴露给与基类相同程序集中的所有类。 - Anthony PegramSuperDog会继承名称字段。
然而,SuperDog无法访问该字段,因此对SuperDog来说没有实际用途。
私有成员在派生类中可以被访问:(如果子类嵌套在基类内)
public class Person
{
private string message;
public override string ToString()
{
return message;
}
public static Person CreateEmployee()
{
return new Employee();
}
class Employee : Person
{
public Employee()
{
this.message = "I inherit private members!";
}
}
}
这个例子的功劳归功于KodefuGuru在MSDN的这个帖子中。
是的,尽管继承者无法访问该成员。
如果你希望他们能够访问它,请将其声明为受保护的。
虽然有人说过这句话,但以下是为什么派生类需要私有字段的一个例子:
class Program
{
static void Main(string[] args)
{
var r = new Random();
foreach(var i in Enumerable.Range(0,100))
new Derived(r).Printer();
Console.Read();
}
}
public class Base
{
private Random r;
public Base(Random r) { this.r = r; }
protected void Print()
{
Console.WriteLine(r.Next(1, 10000));
}
}
public class Derived : Base
{
public Derived(Random r) : base(r) { }
public void Printer()
{
base.Print();
}
}
public class Foo
{
private int a;
public int b;
}
public class Bar : Foo
{
private int c;
public int d;
}
Foo
在堆上占用16个字节。其中4个用于同步块(syncblock),4个用于类型信息(方法表),另外每个int
变量占用4个字节,总共12个字节。另一方面,Bar
将占用24个字节。其中4个用于同步块,4个用于类型信息(方法表),4个用于继承自Foo
的每个int
域,以及4个用于Bar
中的每个int
域,总计24个字节。
不,它们不是。
protected
修饰符可以使字段对派生类可用,但从维护的角度来看,这通常被认为是一个坏主意。你应该使用受保护的属性。
this
修饰符来访问,这意味着代码必须在类内部运行。此外,如果你将 this
强制转换为另一个类(即使是其自身的超类),你只能访问公共项,而不能访问受保护或私有的项。 - Warren Rumakclass X
有私有成员 A
;class Y
派生自 class X
。typeof(Y).GetField("A", Instance | NonPublic | FlattenHierarchy)
返回 null.... typeof(Y).BaseType.GetField("A", Instance | NonPublic | FlattenHierarchy)
返回 A 的 FieldInfo。所以,再一次强调,从 .NET Framework 的角度来看,这些字段并没有被继承。它们仍然 -完全- 存在于基类中。 - Warren Rumak私有成员对于类的后代不可访问。
我不确定所有的访问修饰符,但最基本的只有公共和受保护的成员是可访问的。
尝试使用关键字protected,而不是public/private:
http://msdn.microsoft.com/en-us/library/bcd5672a(VS.71).aspx
struct A{ private: //protected: //public: int x; }; struct B : A{ private: int x; }; int main(){ std::cout << sizeof(A) << '\n'; // 在我的机器上为4 std::cout << sizeof(B) << '\n'; // 在我的机器上为8 std::cout << '\n'; }
- Itachi Uchiwa