基本上,你必須通過父母本身或父類型到B的構造函數。下面的例子說明了最後一種情況。
class A {
B b;
A() {
b = new B(getClass());
}
}
class B {
Class<?> parentClass;
B(Class<?> parentClass) {
this.parentClass = parentClass;
}
void createParent() throws Exception {
Object o = parentClass.newInstance();
}
}
使用generics您可以使其更安全。但是由於功能要求並不完全清楚,所以我把它留下了。
更新按您的更新,創建實例是毫無意義的。你可以檢查類的類型並進行相應的處理。代替在上述例子中createParent()
,做到:
void exit() {
if (parentClass == UserX.class) {
// Terminate program.
} else if (parentClass == UserY.class) {
// Logoff user.
}
}
然而,這是難看。您是否真的不允許在User
接口添加另一種方法?否則,以下將是一個更好的設計(稱爲Strategy pattern):
interface User {
void exit();
}
class ExitController {
void exit(User user) {
user.exit();
}
}
class UserX implements User {
public void exit() {
// Terminate program.
}
}
class UserY implements User {
public void exit() {
// Logoff user.
}
}
根據你的最後一句話:
此外,通過比較父對象/類名是看似非常昂貴到它提供的使用
這是沒有意義的。你測過它了嗎?向我們展示結果。
這聽起來很奇怪,也許你應該重新考慮你的設計。也許你需要一個工廠類。 – starblue 2010-10-11 18:58:45
如果我們真的知道問題出在哪裏,那麼設計建議可能是一個非常好的主意。這聽起來像是某種部分解決方案,但不清楚你想要解決什麼問題。 – 2010-10-11 19:00:07
@dobroby是對的。將來,嘗試闡述功能需求本身,而不是要求如何實現解決方案,畢竟這可能不是正確的解決方案。 – BalusC 2010-10-11 19:07:10