扩展层次结构的具体基类

5

假设我正在使用一个提供形状的库,并且该库提供了以下功能:

class Shape
class Circle extends Shape
class Square extends Shape

但我想介绍红色形状的概念。我无法修改库,但我可以创建:

class RedShape extends Shape

然而,这不能轻易地扩展到RedCircle,因为它不能同时扩展RedShapeCircle

我不认为装饰者模式在这里完全适用,但有没有一种方法可以实现这个目标呢?


我认为在这种情况下,装饰器模式实际上是您最好的选择,因为您不能使用多重继承。 - Alex Burdusel
2个回答

1

短答案可以在Josh Bloch的Effective java中找到,条款16:推荐使用组合而非继承


编辑:组合是你真正需要做的。 Java不允许多重继承。人们已经尝试过。他们有一些方法。他们正在写论文。他们甚至使用代码生成工具或代理(不是jdk代理,在你的情况下,它不能使类的代理),但没有什么比你可能喜欢的更优雅。


这可能应该是一条注释。或者,除了链接之外,您还可以为我们提供有关这个“简短答案”的一些见解 :) - Keiwan
我认为在这种情况下组合并不是答案,因为例如RedShape仍然需要成为一个Shape,以便我可以用draw(Shape)来绘制它。 - DrYap
嗯,除非你知道要画什么,否则你无法“绘制”形状;换句话说,形状的抽象性是通过其“绘制”方法来捕捉的。因此,我希望这个假想的库将Shape#draw作为一个“抽象”方法。 - Kedar Mhaswade

0
定义一个接口Colorable,其中包含方法getColorsetColor,并让有颜色的形状实现它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接