Java不能多重继承,如何解决代码复用的问题?

sinall 2008-05-02 08:09:07
有人说可以这样:
newClass implements interface1, interface2 {
Class1 obj1;
Class2 obj2;

method1{
obj1.method1;
}

method2 {
obj2.method2;
}

}

用聚合的方法貌似可以,不过看起来很丑!而且一点也不面向对象啊?子类为什么要聚合多个父类呢???
...全文
404 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunshine_anycall 2008-05-02
  • 打赏
  • 举报
回复
看看设计模式呗
很能解决问题的
aipb2008 2008-05-02
  • 打赏
  • 举报
回复
在OO中,设计的首先考虑是组合而非继承,代码复用并非因为继承机制。

继承带来的好处是使子类对象能够向上转型,继而可以使用父类对象引用子类对象,产生多态行为,这里才是代码复用的关键之处,在OO中“对接口编程”就是这样,用父类对象(或者接口)来产生构造关系,根据具体引用的子类对象来产生不同行为。

再说下多继承的问题,多继承的好处很多,就如楼主的“拉拉队员”的例子,但是如果她父亲和母亲是继承于一个父亲(近亲结婚,这样才能基因变异嘛),或者再往上几代,那么这位“拉拉队长”就同时拥有了两个爷爷,并且是相同的。这就是典型的“菱形问题”,在实际的开发中,这会导致很多错误和不可估计的结果(假如有很庞大的继承树)。
所以java舍弃了多继承,因为这个东西带来的坏处>好处。然而所谓的好处,也可以通过接口的机制来得到更完美的解决。
但是如果非要直接继承于两个或者多个类(非接口),那么有什么办法没?

答案是:没有
但是,在OO设计中,这样的问题视乎解决的目标,比如,有个类C,他需要非别能被向上转型为A和B,因为现在有两个方法
fa(A a),fb(B b),我们想要复用这两个方法。
那么一个很好的解决办法是“内部类”,因为内部类是可以访问外围类一切对象的。
class C extends A{
B getB(){
return B(){
};
}
}
C c = new C();
fa(c);
fb(c.getB);

当然,如果非要楼主说的那样不“丑陋”,要明确的让拉拉队长和塔父母分别有个“is-a”的关系,很遗憾,这个目标不能达到。
wtmiao000 2008-05-02
  • 打赏
  • 举报
回复
lz为什么说是继承呢?明明就是实现了两个接口。而且,实现的是接口。接口不是类。所以,也不是什么父类。接口就一套规范。说白了就是抽象方法和常量。为什么说丑陋?哪里丑陋,只看外观吗?直觉吗?你用JAVA多久?什么可以随便的说它丑陋?
sinall 2008-05-02
  • 打赏
  • 举报
回复
大家看过美剧《英雄》(Heros)没?

FlyMan
{
fly()
}

FireWoman
{
fire()
}

CheerLeader
{
FlyMan dad;
Firewoman mum;

fly()
{
dad.fly();
}

fire()
{
mum.fire();
}
}

呵呵,看起来,Cheerleader并没有继承她父母的超能力,
当别人让她.fly的时候,她就说,来老爸fly一个。
当别人让她.fire的时候,她就说,来老妈fire一个。

大家就当我纯扯淡,我只想说,这样确实有些丑陋。
Charlemagne 2008-05-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 linli0727 的回复:]
弱弱的问一声ls,java怎么可以让子类拥有两个父类?
[/Quote]

java里面只能从一个父类继承
如果你的类需要2种特性,可以实现2个接口
joejoe1991 2008-05-02
  • 打赏
  • 举报
回复
组合那里丑陋了?
xihaxiha9712 2008-05-02
  • 打赏
  • 举报
回复
接口就是为了解决多重继承才发明的,LS 我也好奇,子类怎么有两个父类。。?
linli0727 2008-05-02
  • 打赏
  • 举报
回复
弱弱的问一声ls,java怎么可以让子类拥有两个父类?
sinall 2008-05-02
  • 打赏
  • 举报
回复
兄弟们,可能我表达有误。
“Java不能多重继承类(实现),如何解决代码复用的问题”???
用聚合的办法可以,不过子类拥有两个父类的引用似乎有些丑陋。。。
milo-higgs 2008-05-02
  • 打赏
  • 举报
回复
所以java才有接口的啊
老紫竹 2008-05-02
  • 打赏
  • 举报
回复
走路和飞行是2个类

如果某个动物既可以走路,又可以飞行,那怎么办?

多重继承还是有其优点的!

java里面就采用 Warkable 和 Flayable 2个接口来解决了!
loujianchengdd 2008-05-02
  • 打赏
  • 举报
回复
其实现在越来越不推荐继承了,继承会增强类之间的依赖,推荐用组合,也就是在一个类创建另一个类的引用,适配器模式或者jdk动态代理应该可以解决继承的问题

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧