在C#中,规范说:
实例构造函数,析构函数和静态构造函数不是 继承,但所有其他成员,无论他们宣称 可达性(§3.5)。但是,取决于他们声明的 可访问性,继承的成员可能无法在派生中访问 类。
所以私有字段会继承到派生类中,但它们不可访问。
然而,Java规范说:
只有声明受保护或公开的类的成员才有 继承自在包中声明的包中声明的子类 该类被宣布。
所以私有字段不会继承到派生类中。
什么能解释OOP理论?是正确的C#还是Java设计师?
在这方面有点困惑。
P.S。 我没有C ++经验? C ++设计师对此有何看法?
答案 0 :(得分:4)
嗯,C#版本更清晰,因为即使在Java中,私有字段也可以作为子对象的一部分使用,但它们不能直接访问,除非你在父类中有一个公共getter来获取它的值。
您实际上可以使用反射来访问(父级的)私有字段并直接读取它们的值。
答案 1 :(得分:3)
保持简单和干净的东西,参考你提到的c ++的部分引用
但是,根据声明的可访问性,可能无法在派生类中访问继承的成员。
同样的事情也发生在Java中。您也无法访问Java中的私有字段。
它们周围有方法可以访问,这是另一个故事(封装)
答案 2 :(得分:1)
至少回答C#/ Java-part,因为我对C ++一无所知。
但是,根据声明的可访问性,可能无法在派生类中访问继承的成员。
C#-spec似乎更有意义,尽管Java以同样的方式处理私有的mebers。来自基类的私有成员也存在于Java中(但它们不是继承的,请参阅are private fields inherited in Java?)。因为你无法访问它们,所以无论如何这都没用。然而,内部结构当然也通过设置私有成员来初始化。因此,派生类的实例当然具有基类的所有私有成员,继承但是意味着任何类型的多态,这意味着您可能能够覆盖(假设你的会员不是static
或final/selead
)他们对私人会员没有任何意义。
因此,无论是在C#还是在Java或其他任何地方,都不需要访问内部。简单地假设您的派生实例将所有基本成员完全初始化并完成您的实际工作。
关于你所谓的“OOP理论”我怀疑这个原则(在所提到的语言中以不同的方式实现)有一个更清晰的答案私人成员根本没有相关性。 OOP只处理对象与周围环境之间的相互作用而不是实际的内部结构。
答案 3 :(得分:1)
我认为这种混淆与令人困惑的措辞有关。在Java或C#或任何其他OO语言中,如果构造子项,则必须调用父构造函数,因为父项是子项的一部分。通常,父构造函数的调用是隐式完成的。
因此,父对象的私有属性始终位于子对象中的某个位置。然后OOP确保您无法访问子项中的私有属性。这种封装是重要的一点。这个事实由两个引用描述:要么你称之为属性不是继承的,要么你说它们是继承但不可见的。
如上所述,您可以(ab)使用反射库来解决这些限制。