刚看过一个教程说:
Class Dog
{
private string Name;
}
Class SuperDog:Dog
{
private string Mood;
}
然后有一个UML显示SuperDog也会继承Name。我试过但似乎只有公共成员才能继承。至少我无法访问Name,除非它被声明为public。
答案 0 :(得分:102)
派生类可以访问 公共,受保护,内部和 保护基地的内部成员 类。即使是派生类 继承基础的私有成员 class,它无法访问这些成员。 但是,所有这些私人成员都是 仍存在于派生类中 他们可以做同样的工作 基类本身。例如, 假设一个受保护的基类 方法访问私有字段。那 字段必须存在于派生中 class为了继承的基础 类方法正常工作。
来自:http://msdn.microsoft.com/en-us/library/ms173149.aspx
所以,技术上,是的,但实际上,没有。
答案 1 :(得分:43)
基类的一切都是 继承到派生类。成员 标记为私人无法访问 为完整性目的而派生的类, 你需要制作它们吗? 在派生类中可访问,标记 成员受保护。
在继承的上下文中有不同级别的成员可访问性。
public
:基类的所有公共成员都可以在derived-class和derived-class的实例中访问。
protected
:基类的所有受保护成员都可以在派生类中访问,而不是派生类的实例。
protected internal
:所有受保护的基类内部成员都可以在derived-class和同一程序集中创建的derived-class实例中访问。
internal
:基类的所有内部成员都可以在derived-class和同一程序集中的derived-class实例中访问。
private
:在派生类和派生类的实例中,不能访问基类的私有成员。
答案 2 :(得分:18)
SuperDog将继承Name字段,是的。
SuperDog NOT 可以访问该字段,因此没有实际用途(就SuperDog而言)。
答案 3 :(得分:2)
私有成员可以在派生类中可见:(如果子类嵌套在基类中)
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中的this thread at MSDN。
答案 4 :(得分:1)
不,他们不是。
protected
修饰符可以使字段可用于派生类,但从维护角度来看,这通常被认为是一个坏主意。您想要使用受保护的属性。
答案 5 :(得分:1)
是的,虽然继承人无法访问该成员。
如果您能够访问它,请将其声明为受保护。
答案 6 :(得分:0)
班级的后代无法访问私人会员。
我不确定所有的访问修饰符,但最基本的只有公共和受保护的成员可以访问。
答案 7 :(得分:0)
基类中的成员必须至少受到保护,以便在派生类中可见。
答案 8 :(得分:0)
尝试使用关键字protected,而不是公开/私有:
http://msdn.microsoft.com/en-us/library/bcd5672a(VS.71).aspx
答案 9 :(得分:0)
改为命名protected
或public
,即可访问。无法从派生类访问私有成员
答案 10 :(得分:0)
正如其他人所说,私人成员是继承的。成员访问权限是一个不同的主题,但并不完全脱离继承的角度。重要的是要理解所有成员都是继承的,无论其访问修饰符如何,因为它会影响子类的大小。请考虑以下代码。
public class Foo
{
private int a;
public int b;
}
public class Bar : Foo
{
private int c;
public int d;
}
Foo
将在堆上消耗16个字节。 4用于同步块,4用于类型信息(方法表),4用于int
变量,总共12个。Bar
,另外一个将占用24个字节。 4表示同步块,4表示类型信息(方法表),4表示从int
继承的Foo
字段,4表示int
字段Bar
字段总共24个。
答案 11 :(得分:0)
是的,是继承的。 但你无法访问它们,因为它们是私有的:)。
答案 12 :(得分:0)
是的,但是它们无法访问,所以看着它你可以诚实地说它们不是遗传的。但是,他们确实是
答案 13 :(得分:0)
人们已经说过了,但是这里有一个例子,说明为什么你需要派生类中的私有字段:
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();
}
}
答案 14 :(得分:-2)
您是正确的,派生类无法访问private
成员。
您应该成为成员protected
或使用基类的公共方法访问它们。
class Player
{
protected string name;
protected string type;
public Player(string name,string type)
{
Console.WriteLine("Player"+ this);
this.name = name;
this.type = type;
}
public void introduce()
{
Console.WriteLine("I am " + this.name + " I'm a " + this.type);
}
}
class Wizard : Player
{
public Wizard(string name,string type):base(name,type)
{
Console.WriteLine("Wizard"+ this);
}
public void Play()
{
//protected modifier made the name field available;
Console.WriteLine("Yipeeee!!!!!"+ " "+ this.name);
//on the other hand
// we can make the name and type fields as private in the base class and access them using the public methods of the base class
introduce();
}