绕过糟糕的设计实践:Java多重继承

时间:2014-11-02 15:33:57

标签: java inheritance javafx

我正在使用JavaFX Shape子类,我遇到了我认为是一个相当奇怪的问题。我的目标是扩展其中几个形状子类(即RectangleCircle),以便将我自己的属性添加到这些对象中。例如,Rectangle子类的扩展名如下所示:

public class MyRectangle extends javafx.scene.shape.Rectangle 
    implements SpecialInterface {

    private SpecialAttributes specialAttributes;

    // ...
    // Constructors, getters and setters here
    // ...
}

SpecialInterface可用于指定与将添加到MyRectangleMyCircle的新属性相关的方法,在这种情况下:

public interface SpecialInterface {

    public SpecialAttributes getSpecialAttributes();
    public void setSpecialAttributes();

} 

但是,当我尝试创建引用RectangleCircle的子类的服务类时,似乎我不能这样做。基本上,当我需要利用Shape子类和SpecialInterface接口的属性和方法时,就会出现问题:

public class ManipulationService{

    public ManipulationService(<Undefined> myExtendedShape) {
        // object from JavaFX Node, inherited by JavaFX Shapes (Circle, Rectangle, etc)
        myExtendedShape.onRotate(new EventHandler<>(){
            // ...
        });

        // a method from MyRectangle or MyCircle
        myExtendedShape.getSpecialAttributes();
    }

    // ...
}

这里的问题是我不能为我的扩展形状创建一个超类来替换上面的<Undefined>。具体来说,如果我创建一个超类,由于缺少多重继承,我无法扩展我想在子类中扩展的特定形状。但是,如果我将<Undefined>替换为Shape,则会失去SpecialInterface中方法的访问权限。

我确定之前已经解决了这种多重继承问题,但我找不到解决方案。我很感激有关如何处理这种情况的任何建议。

1 个答案:

答案 0 :(得分:3)

您可以像这样定义ManipulationService

class ManipulationService<T extends Shape & SpecialInterface> {
    public ManipulationService(T myExtendedShape) {
        // method from Shape
        myExtendedShape.onRotate(/* ... */);

        // method from SpecialInterface
        myExtendedShape.getSpecialAttributes();
    }
}