說我有一個A級「是的instanceof」界面設計不好
class A
{
Z source;
}
現在,上下文告訴我,「Z」可以是沒有按」不同類別(比如,B和C)的實例在他們的繼承樹中共享任何普通的類。
我猜想,天真的做法是讓'Z'成爲一個接口類,並使類B和C實現它。
但是仍然有些東西不能說服我,因爲每次使用類A的實例時,我需要知道'源'的類型。所以所有在多個「ifs」中做完的都是「instanceof」,這聽起來不太好。也許將來有一些其他類實現Z,並且硬編碼這種類型的ifs肯定會破壞某些東西。
問題的癥結在於,我無法通過向Z添加函數來解決問題,因爲在Z的每個實例類型中完成的工作是不同的。
我希望有人能給我和建議,也許關於一些有用的設計模式。
感謝
編輯:工作「的人」確實在一些地方,當得到A的一些實例是完全不同的視接口Z.這就是問題背後的階級,即是否「重要的工作實體'不是Z,是別人想要知道誰是Z.
EDIT2:也許一個具體的例子,將有助於:
class Picture
{
Artist a;
}
interface Artist
{
}
class Human : Artist { }
class Robot : Artist {}
現在的地方我有Picture
一個實例,
Picture p = getPicture();
// Now is the moment that depending if the type of `p.a` different jobs are done
// it doesn't matter any data or logic inside Human or Robot
請問您能詳細說明爲什麼您真的需要知道Z的真實類型?只要你知道它的接口(可用的方法等),你可以做你需要的一切。 –
我添加了一些額外的信息。 –
@DanielMonteiro:在很多情況下,人們會收集一些對象,其中一些會繼承或實現'Foo',其中一些不會,另一種願望希望在集合中的所有內容上執行一個動作可以爲所有對象定義,但可以通過'Foo'實例更好地完成。在這種情況下使用'instanceof'在我看來完全合適。 – supercat