C# 中私有成员的继承
本文关键字:继承 成员 | 更新日期: 2023-09-27 18:35:50
C# 中继承类时是否继承私有成员?我读过一些与此相关的主题,有人说私有成员是继承的,但无法访问私有成员,有人说继承类时它不是继承的。请解释一下这个概念。如果是遗传的,有人可以给出解释吗?
谢谢
如果我正确理解您的问题,那么您不关心可访问性,您只关心私人成员是否继承
答案是肯定的,所有私有成员都是继承的,但如果不反思,您将无法访问它们。
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
,在这种情况下,您可以从派生类型访问它们。
是的,他们继承了。子类仍然是父类类型,因此继承所有内容。孩子只是不能直接访问它,但是如果您调用使用私有父字段的基类方法,那将正常工作。
私有成员不能继承,只能像扩展私有成员一样受保护。
就像斯里拉姆说的,是的,私人成员确实被继承了,但他们无法访问。
如果它们不被继承,则受保护或公共属性引用私有成员将在继承的类中中断。
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 访问它。
private
的成员只能在定义它们的类型上访问。不能从派生类型访问它们。
标记为protected
的成员可以在定义它们的类型和派生类型上访问。
标记为internal
的成员只能从定义类型的程序集访问。您可以组合使用protected
和internal
访问修饰符。
在谈论私人成员的价值观时:当然他们是继承的。派生类也始终属于基类的类型。如果基类持有用于存储某些数据的私有值,则派生类也会执行此操作 - 只是您无法从派生类访问该值。
另请阅读有关 MSDN 中辅助功能级别的相关文章。
你所说的私有字段被继承是完全正确的。
发生的情况如下:子类将继承基类的行为。这种行为可能需要一些字段才能工作。因此,您的子类将为它们保留一些空间,但您将无法操作这些字段,只能通过使用方法(公共和受保护的方法)
换句话说,子类通过将基类字段保存在内存中来继承基类字段,但它无法访问它们。
在低级别上,是编译器阻止您访问/更改这些私有字段,但即使使用反射,您仍然可以这样做。
如果您需要任何澄清,请告诉我
来自 http://msdn.microsoft.com/en-us/library/ms173149.aspx
派生类有权访问公共、受保护、内部、 并保护基类的内部成员。即使 派生类继承基类的私有成员,它 无法访问这些成员。但是,所有这些私人成员都是 仍然存在于派生类中,并且可以执行与它们相同的工作 在基类本身中执行。例如,假设受保护的 基类方法访问私有字段。该字段必须是 存在于派生类中,以便为继承的基类 正常工作的方法。
为了扩展所说的内容,当内部作用域发挥作用时,子类可以访问私有。例如,将编译以下内容:
class A
{
private int _private;
class B : A
{
void Foo()
{
this._private = 2;
}
}
}
简短回答:是的,但您无法直接访问它们。
当类 A 派生自类 B 并且 B 具有私有属性时,该属性将用于派生自类 A 的实例。但是,您无法访问它。它必须在那里,因为 B 类中指定的行为取决于它。
趣事:实际上,仍然可以通过一种称为反射的东西来访问私有财产。但不要担心,你不应该为此目的使用反思,除非你真的需要知道发生了什么,你在做什么。
最简单的答案 你不能直接访问派生类中基类的私有变量,但是是的,当启动覆盖类对象时,这个私有对象和值在基类中初始化(因此基类变量被继承),如果基类公开它们,你可以使用一些属性或函数访问它们。
为了使解释更清楚,
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
}
}
如果初始化了类 B 的对象,那么 A.i、A.j、A.k 变量将被初始化,使用 B.i、B.j、B.k、B.l 变量,如果基类公开函数或属性,那么我可以访问所有基类变量。