OOP和私人领域的继承

在C#中规范说:

实例构造函数,析构函数和静态构造函数不会被继承,但所有其他成员无论其声明的可访问性如何(第3.5节)。 但是,根据其声明的可访问性,继承的成员可能无法在派生类中访问。

所以私有字段被继承到派生类中,但它们不可访问。

但是Java规范说:

只有被声明为protected或public的类的成员才会被声明在包中声明的子类继承。

所以私有字段不会被继承到派生类中。

什么解释OOP理论? 是正确的C#或Java设计者?

在这方面有点困惑。

PS我没有C ++经验? C ++设计师对此有何评论?


好吧,C#版本更加清晰,因为即使在Java中,私有字段也将作为子对象的一部分提供,但除非您在父类中有一个公共获取器以获取其值,否则将无法直接访问它们。

实际上,您可以使用反射来使(父代的)专用字段可访问并直接读取它们的值。


保持简单和干净的事情,采取一些你提到的c ++的引用

但是,根据其声明的可访问性,继承的成员可能无法在派生类中访问。

同样的事情也发生在Java中。 您也无法访问Java中的私有字段。

他们周围有方法访问这是另一个故事(封装)


至少回答C#/ Java部分,因为我对C ++不太了解。

但是,根据其声明的可访问性,继承的成员可能无法在派生类中访问。

尽管Java以相同的方式处理私有的mebers,但C#规范似乎更有意义。 基类的私有成员也存在于Java中(但是它们没有被继承,请参阅Java中继承的私有字段?)。 因为无法访问它们,所以这不是有用的。 然而内部组件当然也是通过设置私人成员来初始化的。 因此,派生类的实例当然具有基类的所有私有成员,但是继承意味着任何种类的多态性,这意味着您可能会覆盖(假设您的成员不是staticfinal/selead ),它们使得不成立感觉私人会员。

因此,在C#,Java和其他任何地方都不需要访问内部。 简单地假设你的派生实例可以让所有的基础成员完全初始化并且完成你的实际工作。

关于你称之为“OOP理论”的问题,我怀疑这个原则 (在所提及的语言中以不同方式实现)的私人成员完全没有关系。 面向对象只是处理对象与它们周围的交互,而不是它们的实际内部。

链接地址: http://www.djcxy.com/p/60259.html

上一篇: OOP and inheritance of private fields

下一篇: detect protected method and avoid fatal error