2014-11-02 79 views
0

我正在使用JavaFX Shape的子類,並且遇到了我認爲是一個相當奇怪的問題。我的目標是擴展這些形狀子類中的幾個(即RectangleCircle),以便將我自己的屬性添加到這些對象。例如,Rectangle子類的擴展應該是這樣的:錯誤設計實踐:Java多繼承

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這些子類服務類,它好像我不能這樣做的一般。

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>一個超:從本質上講,當我需要從兩個Shape子類和SpecialInterface接口使用屬性和方法的問題出現了。具體來說,如果我創建一個超類,由於缺乏多重繼承,我無法擴展我想在我的子類中擴展的特定形狀。但是,如果我將<Undefined>替換爲Shape,那麼我將無法訪問SpecialInterface中的方法。

我敢肯定,這種多繼承問題之前已經解決了,但我找不到解決方案。我很感激所有關於如何處理這種情況的建議。

+1

我認爲你應該多一點很清楚,爲什麼你提到的類沒有爲工作。爲什麼不製作自己的超級類型(MyShape)並使用它,使用所需的所有方法定義? – markspace 2014-11-02 15:41:58

+0

@markspace那麼你將如何定義'MyRectangle'?它必須從'MyShape'和'Rectangle'繼承,這是不可能的。 – 2014-11-02 15:49:34

+0

那你去吧。不可能。我認爲這是一個[XY問題:](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)你認爲必須有一個解決方案,但可能有其他的方法是更好。根據形狀定義一個MyCircleRectangle並告訴我們爲什麼不起作用。 – markspace 2014-11-02 15:52:19

回答

3

可以定義ManipulationService這樣的:

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

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

有趣的 - 我沒有看到類似泛型的'&'字符。即使'SpecialInterface'是一個界面,它仍然可以工作嗎? – nmagerko 2014-11-02 16:00:31

+1

這將完全**,因爲它是一個接口。允許多重繼承,只要您繼承的類不超過一個,並且您可以繼承任意數量的接口。 – RealSkeptic 2014-11-02 16:01:30

+1

@nmagerko當'SpecialInterface'是一個接口時,它可以工作_only_。 – 2014-11-02 16:02:05