为什么Java不支持像C ++这样的私有/受保护的继承?[关闭]


12

在C ++中继承类时,用户可以指定访问说明符,例如,

class Base
{
    public int mem1;
    protected in mem2;
};

class Derived1 : **private** Base
{
    // mem1 will be private here.
    // mem2 will be private here.
};

class Derived2 : **protected** Base
{
    // mem1 will be protected here.
    // mem2 will be protected here.
};

class Derived2 : **public** Base
{
    // mem1 will be public here.
    // mem2 will be protected here.
};

但是在Java中是不可能的,也就是说,在Java中扩展始终像C ++中的“公共”继承。

有人可以解释原因吗?


16
一个人不需要删除功能的理由,一个人需要添加一个理由(理想情况下,几个不错的理由)。

1
这只能通过推测来回答,投票关闭。
Jimmy Hoffa 2013年

Answers:


10

私有/受保护的继承给您带来的大多数好处可以通过封装轻松实现。托马斯·埃丁(Thomas Eding)提供了一些很好的案例实例,这些案例可以通过添加私有/受保护的继承而变得更加容易,尽管这些是有效的案例,但存在一些解决方法,它们不需要私有/受保护的继承,并且更“惯用”(在Java中,最小)。

Java语言的开发人员显然认为,支持私有/受保护的继承(包括多重继承)所需的复杂性成本超过了它所提供的收益。


1
值得注意的是,在C ++中,私有继承和作为成员的包含之间存在一些重要区别,但是它们围绕初始化和多重继承的顺序展开,因此不会转换为Java的简单对象系统。
Jan Hudec

2
-1:“ 私有/受保护的继承给您带来的任何好处都可以通过封装轻松实现。” 错误。我同意“ 最大的收益……”
托马斯·爱丁

@ThomasEding您能否举例说明可以通过私有/受保护的继承而不是通过封装来实现的东西(或者至少可以通过封装完成很多工作)?老实说,我想不出一个,但是我很容易被说服。
pswg 2014年

2
糟糕,抱歉。这是C ++中的一些示例。(1)假设您想在内部将class B视为AB私有继承自A),因此可以在某种方法中多态使用它。使用合成,可以做到这一点,但麻烦得多。在这里,您需要创建一个单独的子类A'(可能是一个内部类)来实现您使用的功能。您还需要手动将更改委派给父B类(B结交A'朋友,A'接受对的引用B)。我想这并不是很困难,但是会在代码中造成混乱。(续)
托马斯·爱丁

2
...(2)如果您想B访问中的受保护变量A,则私有继承同样可以更轻松地实现复合。使用composition,您可以实现A'与上述类似的操作,并且/或者提高对受保护变量的访问权限。(3)假设您需要一个共享的静态成员变量,该变量在模板实例化时是完全相同的变量。一种解决方案是从具有静态成员的非模板基类私有继承。组合无法解决此问题,尽管其他技术也可以(例如,将其他类与成员进行朋友交流)。
托马斯·爱丁

9

由于Java没有多重继承,并且所有内容都必须(公开)继承Object,因此Java中没有任何地方可以通过私有或受保护的继承来产生有效的程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.