目前有这样的需求:需要扩展某类库中一些类的功能,这些类都继承自“按钮”类,我需要为它们添加统一的功能,其中有些功能需要重写“按钮”类的一些方法。
这种情况即便写一个接口规定好方法签名,也还是要在每一个扩展类里分别写一遍功能代码的,遇到需要修改的情况必定苦不堪言。
我想这个情况如果能有多重继承就最好不过了,但Java和C#都不支持多重继承,C#到3.0才支持扩展方法,但扩展方法也是很受限的,比如没法实现重写方法(PS:我这项目是Java的,最好也别考虑C#扩展方法),那么该如何变通实现多重继承呢?
或者有什么其他的好办法解决此问题?
你这里没有看到多重继承啊,试试装饰(Decorator)模式,应该有足够的灵活性, 难道你不知道?
谢谢你的建议,似乎这样不错,我去尝试一下。;)
装饰器模式确实不错,我创建了一个泛型的装饰器来封装各类,就是需要重写很多方法,量太大最后借助正则表达式完成了。;)
多继承还用java干嘛。
把方法标记为virtual,可以重写的。java没有这个关键字?
开发项目不是想用什么语言就用什么语言的吧。
这里说的是多重继承,不是多态。
java可以随意重写父类方法,除非方法标记为final。
@斯克迪亚: 我知道,我的意思是多继承不是java的初衷吧?
java可以随意重写父类方法那么你的问题:比如没法实现重写方法
你的意思是重写方法同事,签名可能也会改变?
@写代码的小2B: @写代码的小2B: 我的意思是以单继承的方式分别继承上面每一个类做扩展的话,需要分别重复编写扩展的功能代码,这样维护起来是灾难啊。
封闭不变的,开放变化的。
一个按钮,如果上面放个图像,建图像按钮类;如果上面放文本,建文本按钮类;如果有图像有文本,建图像文本按钮类......
这个不应该用继承模式,而应该是组合模式。
图像、文本作为按钮的属性
因为是外部类库,没法改动他们设计好的东西。
@斯克迪亚:
那也是继承一下,然后这个继承的类,使用属性
这种情况即便写一个接口规定好方法签名,也还是要在每一个扩展类里分别写一遍功能代码的,遇到需要修改的情况必定苦不堪言。
--------------------------
我也觉得这种场景用装饰模式很适合啊。如果你每一个扩展类要重写的代码都完全不一样,那就什么办法都没有,改起来还是要一个一个改。 但是如果,每一个扩展类要重写的代码有共性,那就把一个共性抽象出一个装饰类。那么以后修改的话,只需要统一修改装饰类(有几个共性就几个装饰类)就好了。
不知道是不是这样?我理解有没有没?
记得老大说过,java中的接口就是为了实现多重继承而存在的。
用接口,就可以解决了。