私人成员是用C#inheritance吗?

刚刚看到一个教程说:

Class Dog { private string Name; } Class SuperDog:Dog { private string Mood; } 

然后有一个UML显示,SuperDog也会inheritanceName。 我曾试过,但对我来说,似乎只有公共成员是遗传的。 至less我不能访问名称,除非它被宣布为公开。

派生类可以访问基类的公共,受保护,内部和受保护的内部成员。 即使派生类inheritance了基类的私有成员,也不能访问这些成员。 然而,所有这些私人成员仍然存在于派生类中,并且可以在基类本身做同样的工作。 例如,假设受保护的基类方法访问专用字段。 该字段必须出现在派生类中,以使inheritance的基类方法正常工作。

来自: http : //msdn.microsoft.com/en-us/library/ms173149.aspx

所以,从技术上来说,是的,但几乎没有。

基类中的所有东西都被inheritance到派生类。 标记为私人的成员不能为了完整性目的而获得派生类,如果您需要使派生类可以访问派生类,请将成员标记为受保护的。

在inheritance的背景下,成员的可访问性各不相同。

public :基类的所有公共成员都可以在派生类和派生类的实例中访问。

protected :基类的所有受保护成员都可以在派生类中访问,而不能在派生类的实例中访问。

protected internal :基类的所有受保护的内部成员都可以在派生类中访问,也可以在同一个程序集内创build派生类的实例。

internal :基类的所有内部成员都可以在派生类中访问,也可以在同一个程序集中派生类的实例中访问。

private :在派生类和派生类的实例中,不能访问基类的私有成员。

SuperDog会inheritanceName字段,是的。

SuperDog将不能进入该领域,所以没有实际的用途(就SuperDog而言)。

是的,虽然inheritance人不能访问该成员。

如果他们能够访问它,请将其声明为受保护的

不,他们不是。

protected修饰符可以使派生类可用的字段,但从维护的angular度来看,这通常被认为是一个坏主意。 你会想要使用保护属性。

基类中的成员必须至less受到保护,以便在派生类中可见。

尝试使用关键字protected,而不是public / private:

http://msdn.microsoft.com/en-us/library/bcd5672a(VS.71).aspx

使名称protectedpublic ,而将是可访问的。 私人成员不能从派生类访问

私人成员不能通过一个class级的后裔进入。

我不确定所有访问修饰符,但在最基本的只有公共和受保护的成员是可访问的。

是的,是inheritance的。 但是你不能访问它们,因为它们是私人的:)。

正如其他人所说,私人成员是遗传的。 成员访问是一个不同的主题,但不完全脱离了inheritance的观点。 理解所有成员都是inheritance的,不pipe他们的访问修饰符是很重要的,因为它会影响子类的大小。 考虑下面的代码。

 public class Foo { private int a; public int b; } public class Bar : Foo { private int c; public int d; } 

Foo将在堆上占用16个字节。 4为同步块,4为types信息(方法表),4为intvariables,总共为12个。另一方面, Bar将消耗24个字节。 同步块为4,types信息(方法表)为4,从Fooinheritance的int域为4,而Barint域为4,总数为24。

是的,但是他们无法访问,所以看着它,你可以诚实地说,它们不是遗传的。 但是,他们确实是

私有成员可以在派生类中可见:

 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!"; } } } 

这个例子的信用在MSDN的这个线程去KodefuGuru 。

人们已经说过了,但下面是为什么您需要派生类中的私有字段的一个例子:

 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(); } }