2012-12-25 39 views
0

這裏是一個Java編程情我願看到任何可能的改進。得到一個子類的實例從一個集合 - Java的

B類是類A的一個子類B的一些實例是在集合。根據類型,我可以使用instanceof從集合中檢索B類實例。但是,我不能將這些實例視爲B類的實例,但是A類的唯一原因是不允許向下轉換。所以,我必須通過在類A中使用override getters來獲取一些實例的小部分。此解決方法有幾個問題。例如,一些getter在父類中沒有意義,並且父類不能是抽象的。

任何更好的解決方案?

+4

你爲什麼認爲,你不能做下降?你試過了嗎?並且請張貼一些代碼來證明你正在嘗試做什麼。 –

+0

請放一些代碼。 –

+0

您可以使用子類進行強制轉換,但必須確定它是該子類的一個實例。 –

回答

0

而是爲了做一些事情,讓對象直接做詢問信息的對象。例如,更換

int a = object.getA(); 
int b = object.getB(); 
int sum = a + b; 

int sum = object.computeSum(); 

這樣,如果子類沒有getB()方法,因爲它alsways視爲0,它可以實現使用

方法 computeSum()
return this.a; 

對不起,這個愚蠢的例子,但是這想法。添加行爲到你的對象,而不是讓他們與getter和setter的數據結構。如果你發佈一個你必須做的具體事例,我可以提供更多幫助。要做到這一點,而不鑄造

+0

我明白你的意思,這是我們使用instanceof時遇到的一個問題。但是,檢索子類的實例是在API外面。 – vic

0

的一種方法是使用visitor pattern。這在Java中有點冗長,但非常具有可擴展性......

interface Visitor { 
    void visit(A a) 
    void visit(B b) 
} 

class BOnlyVisitor implements Visitor { 
    public void visit(A a) { 
     throw new UnsupportedOperationException(); 
    } 

    public void visit(B b) { 
     // Do stuff with b 
    } 
} 

interface Visitable { 
    void accept(Visitor v) 
} 

class A implements Visitable { 
    public void accept(Visitor v) { 
     v.visit(this); 
    } 
} 

class B implements Visitable { 
    @Override 
    public void accept(Visitor v) { 
     v.visit(this); 
    } 
} 
+0

感謝您的建議。我們的使用場景沒有填寫設計模式意圖。一個有趣的人,但。 – vic

相關問題