這裏是一個Java編程情我願看到任何可能的改進。得到一個子類的實例從一個集合 - Java的
B類是類A的一個子類B的一些實例是在集合。根據類型,我可以使用instanceof從集合中檢索B類實例。但是,我不能將這些實例視爲B類的實例,但是A類的唯一原因是不允許向下轉換。所以,我必須通過在類A中使用override getters來獲取一些實例的小部分。此解決方法有幾個問題。例如,一些getter在父類中沒有意義,並且父類不能是抽象的。
任何更好的解決方案?
這裏是一個Java編程情我願看到任何可能的改進。得到一個子類的實例從一個集合 - Java的
B類是類A的一個子類B的一些實例是在集合。根據類型,我可以使用instanceof從集合中檢索B類實例。但是,我不能將這些實例視爲B類的實例,但是A類的唯一原因是不允許向下轉換。所以,我必須通過在類A中使用override getters來獲取一些實例的小部分。此解決方法有幾個問題。例如,一些getter在父類中沒有意義,並且父類不能是抽象的。
任何更好的解決方案?
而是爲了做一些事情,讓對象直接做詢問信息的對象。例如,更換
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的數據結構。如果你發佈一個你必須做的具體事例,我可以提供更多幫助。要做到這一點,而不鑄造
我明白你的意思,這是我們使用instanceof時遇到的一個問題。但是,檢索子類的實例是在API外面。 – vic
的一種方法是使用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);
}
}
感謝您的建議。我們的使用場景沒有填寫設計模式意圖。一個有趣的人,但。 – vic
你爲什麼認爲,你不能做下降?你試過了嗎?並且請張貼一些代碼來證明你正在嘗試做什麼。 –
請放一些代碼。 –
您可以使用子類進行強制轉換,但必須確定它是該子類的一個實例。 –