如果我正确理解了你的问题,那么你不关心可访问性,而只关心私有成员是否被继承
答案是肯定的,所有私有成员都被继承,但你不能在没有反射的情况下访问它们。
public class Base
{
private int value = 5;
public int GetValue()
{
return value;
}
}
public class Inherited : Base
{
public void PrintValue()
{
Console.WriteLine(GetValue());
}
}
static void Main()
{
new Inherited().PrintValue();//prints 5
}
你可以将某些内容标记为protected
,这样你就可以从派生类型中访问它们。
编辑:就继承而言,是的,子类确实会继承。子类仍然是父类类型,因此继承了所有东西。子类只是不能直接访问它,但如果你调用使用私有父字段的基类方法,那么这将运行良好。
就像Sriram所说的,是的,私有成员确实会被继承,但它们不可访问。
如果它们不会被继承,受保护或公共属性引用私有成员将在继承类中断。
class myBase
{
private string _myProp;
protected string MyProp
{
get
{
return _myProp;
}
set
{
_myProp = value;
}
}
}
class myChild : myBase
{
public myChild()
{
_myProp = "SomeString"; // This will fail!!!
this.Myprop = "SomeString"; // This works
}
}
在子类中,您无法直接访问基类中的私有属性_myProp。但是,该成员已被继承,因此可以通过受保护的属性MyProp进行访问。
class A
{
private int _private;
class B : A
{
void Foo()
{
this._private = 2;
}
}
}
最简单的答案是,您不能直接访问派生类中基类的私有变量,但是当覆盖类对象被初始化时,这些私有对象和值在基类中被初始化(因此继承了基类变量),如果基类公开了某些属性或函数,则可以使用它们来访问它们。
为了使解释更清晰,
class A
{
private int i;
private int j;
protected int k;
public A()
{
i = j = k = 5;
}
}
class B : A
{
private int i; //The same variable exist in base class but since it is private I can declare it
private int j;
private int k; //Here I get warning, B.k hides inherited member A.k'. Use the new keyword if hiding was intended. F:\Deepak\deepak\Learning\ClientUdpSocketCommunication\ClientUdpSocketCommunication\Program.cs 210 25 ClientUdpSocketCommunication
private int l;
private int m;
private int n;
public B()
{
i= j = this.k = l = m = n = 7; // Here I have used this.k to tell compiler that I want to initialize value of k variable of B.k class
base.k = 5; //I am assigning and accessing base class variable as it is protected
}
}
被标记为private
的成员只能在定义它们的类型中访问。您无法从派生类型中访问它们。
被标记为protected
的成员可以在定义它们的类型和派生类型中访问。
被标记为internal
的成员只能从定义该类型的程序集中访问。
您可以组合使用protected
和internal
访问修饰符。
当谈论私有成员的值时:它们当然是继承的。派生类始终也是基类的类型。如果基类持有一个私有值来存储一些数据,则派生类也会这样做,只是您无法从派生类中访问该值。
请还阅读MSDN中的可访问性级别相关文章。
来自http://msdn.microsoft.com/en-us/library/ms173149.aspx
派生类可以访问基类的公有、保护、内部和受保护的内部成员。虽然派生类继承了基类的私有成员,但它不能访问这些成员。不过,所有这些私有成员仍然存在于派生类中,并且可以执行它们在基类本身中执行的相同工作。例如,假设一个受保护的基类方法访问一个私有字段。该字段必须存在于派生类中,以便继承的基类方法正常工作。
你说的关于私有字段被继承的问题是完全正确的。
这里发生了什么:子类将继承基类的行为。该行为可能需要一些字段来工作。因此,您的子类将为它们保留一些空间,但您将无法操作那些字段,只能使用方法(公共和受保护的方法)
换句话说,您的子类通过在内存中保存它们来继承基类字段,但它不能访问它们。
在低级别上,是编译器防止您访问/更改那些私有字段,但即使使用反射,您仍然可以这样做。
如果您需要任何澄清,请告诉我。
简短回答:是的,但您无法直接访问它们。
当类A从类B派生,并且B具有私有属性时,则该属性将存在于派生自类A的实例中。但是,您无法访问它。它必须存在,因为类B中指定的行为取决于它。
趣闻: 实际上,仍然可以使用称为反射的东西访问私有属性。但是不要担心这个问题,除非您真的需要知道正在发生什么以及您正在做什么,否则不应为此目的使用反射。
private
表示子类无法访问它(除非使用反射)。这就是为什么存在protected
的原因。 - Tim Schmelter