私有成员是否继承在C#中?

Pet*_*etr 57 c# inheritance private

刚看到一个教程说:

Class Dog
{
  private string Name;
}
Class SuperDog:Dog
{
 private string Mood;
}
Run Code Online (Sandbox Code Playgroud)

然后有一个UML显示SuperDog也会继承Name.我试过但似乎只有公共成员才能继承.至少我无法访问Name,除非它被声明为public.

Mar*_*Eve 103

派生类可以访问基类的public,protected,internal和protected内部成员.即使派生类继承了基类的私有成员,它也无法访问这些成员.但是,所有这些私有成员仍然存在于派生类中,并且可以执行与基类本身相同的工作.例如,假设受保护的基类方法访问私有字段.该字段必须存在于派生类中,以便继承的基类方法正常工作.

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

所以,从技术上讲,是的,但实际上,没有.

  • 我总是使用文档作为实际的"合同",但作为一个兴趣点,.NET Reflection API似乎并不同意这一点.如果你试图使用`derivedType.GetField("f",BindingFlags.Instance | BindingFlags.NonPublic)从派生类中提取私有字段,你将得不到任何回报,即使这在技术上应该返回所有继承的成员.因此,即使技术上*必须*存在,但运行时的所有相关部分都将它视为实际上并不存在. (10认同)
  • @Aaronaught:如果你自己走上继承树,似乎只能使用反射来访问私有成员.请参见http://stackoverflow.com/questions/686482/c-accessing-inherited-private-instance-members-through-reflection/686623#686623 (2认同)

thi*_*eek 47

基类中的所有内容都继承到派生类.如果您需要在派生类中访问它们,请将成员标记为受保护,那么标记为private的成员将无法访问派生类以实现完整性.

在继承的上下文中有各种级别的成员可访问性.

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

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

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

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

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


Jus*_*ner 19

SuperDog将继承Name字段,是的.

SuperDog 不会访问该字段,因此没有实际用途(就SuperDog而言).


War*_*mak 0

不,他们不是。

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

  • 当然???我相信它们是继承的——只是后代阶级无法访问它们。为什么?如果你将你的后代强制转换为基类会发生什么 - 如果基类的私有成员没有被继承......那么怎么办? (7认同)
  • -1 它们是遗传的。它们只是对派生类不可见。这个问题似乎来自 OOP 新手,不要通过混淆术语来混淆他们。 (4认同)
  • @Warren:再次阅读问题。他知道他无法“访问”基类的私有成员。他想知道他们是否“在那里”。 (2认同)