首页 新闻 搜索 专区 学院

如何变相实现多重继承?

0
悬赏园豆:120 [已解决问题] 解决于 2012-01-01 20:09

目前有这样的需求:需要扩展某类库中一些类的功能,这些类都继承自“按钮”类,我需要为它们添加统一的功能,其中有些功能需要重写“按钮”类的一些方法。

这种情况即便写一个接口规定好方法签名,也还是要在每一个扩展类里分别写一遍功能代码的,遇到需要修改的情况必定苦不堪言。

我想这个情况如果能有多重继承就最好不过了,但Java和C#都不支持多重继承,C#到3.0才支持扩展方法,但扩展方法也是很受限的,比如没法实现重写方法(PS:我这项目是Java的,最好也别考虑C#扩展方法),那么该如何变通实现多重继承呢?

或者有什么其他的好办法解决此问题?

斯克迪亚的主页 斯克迪亚 | 老鸟四级 | 园豆:4124
提问于:2011-12-30 09:47
< >
分享
最佳答案
0

你这里没有看到多重继承啊,试试装饰(Decorator)模式,应该有足够的灵活性, 难道你不知道?

收获园豆:60
ChatinCode | 老鸟四级 |园豆:2272 | 2011-12-30 12:35

谢谢你的建议,似乎这样不错,我去尝试一下。;)

斯克迪亚 | 园豆:4124 (老鸟四级) | 2011-12-30 17:30

装饰器模式确实不错,我创建了一个泛型的装饰器来封装各类,就是需要重写很多方法,量太大最后借助正则表达式完成了。;)

斯克迪亚 | 园豆:4124 (老鸟四级) | 2012-01-01 20:11
其他回答(5)
0

多继承还用java干嘛。

把方法标记为virtual,可以重写的。java没有这个关键字?

写代码的小2B | 园豆:4346 (老鸟四级) | 2011-12-30 12:28

开发项目不是想用什么语言就用什么语言的吧。

这里说的是多重继承,不是多态。

java可以随意重写父类方法,除非方法标记为final。

支持(0) 反对(0) 斯克迪亚 | 园豆:4124 (老鸟四级) | 2011-12-30 12:33

@斯克迪亚: 我知道,我的意思是多继承不是java的初衷吧?

java可以随意重写父类方法那么你的问题:比如没法实现重写方法

你的意思是重写方法同事,签名可能也会改变?

支持(0) 反对(0) 写代码的小2B | 园豆:4346 (老鸟四级) | 2011-12-30 12:41

@写代码的小2B: @写代码的小2B: 我的意思是以单继承的方式分别继承上面每一个类做扩展的话,需要分别重复编写扩展的功能代码,这样维护起来是灾难啊。

支持(0) 反对(0) 斯克迪亚 | 园豆:4124 (老鸟四级) | 2011-12-30 17:26
0

封闭不变的,开放变化的。

 

一个按钮,如果上面放个图像,建图像按钮类;如果上面放文本,建文本按钮类;如果有图像有文本,建图像文本按钮类......

 

这个不应该用继承模式,而应该是组合模式。

图像、文本作为按钮的属性

小彬 | 园豆:947 (小虾三级) | 2011-12-30 12:45

因为是外部类库,没法改动他们设计好的东西。

支持(0) 反对(0) 斯克迪亚 | 园豆:4124 (老鸟四级) | 2011-12-30 17:26

@斯克迪亚: 

 

那也是继承一下,然后这个继承的类,使用属性

支持(0) 反对(0) 小彬 | 园豆:947 (小虾三级) | 2011-12-30 17:29
0

这种情况即便写一个接口规定好方法签名,也还是要在每一个扩展类里分别写一遍功能代码的,遇到需要修改的情况必定苦不堪言。

--------------------------

我也觉得这种场景用装饰模式很适合啊。如果你每一个扩展类要重写的代码都完全不一样,那就什么办法都没有,改起来还是要一个一个改。 但是如果,每一个扩展类要重写的代码有共性,那就把一个共性抽象出一个装饰类。那么以后修改的话,只需要统一修改装饰类(有几个共性就几个装饰类)就好了。

 

不知道是不是这样?我理解有没有没?

收获园豆:60
寒风吹过 | 园豆:149 (初学一级) | 2011-12-30 17:34
0

记得老大说过,java中的接口就是为了实现多重继承而存在的。

wofengletian | 园豆:172 (初学一级) | 2011-12-30 17:47
0

用接口,就可以解决了。

charje | 园豆:192 (初学一级) | 2011-12-31 20:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册