2010-11-04 88 views
24

在Java中,我該如何去決定一個類的擴展類?如何確定一個類是否擴展了Java中的另一個類?

public class A{ 
} 

public class B extends A{ 
} 

public class C extends A{ 
} 

public class D{ 
} 

public class E extends B{ 
} 

public class doSomething{ 

    public void myFunc(Class cls){ 
     //need to check that cls is a class which extends A 
     //i.e. B, C and E but not A or D 
    } 
} 

would cls.getSuperClass()請問我需要什麼?

回答

48

getSuperClass()方法將因E失敗,因爲其直接超類不是A,而是B。而是使用Class#isAssignableFrom()

public void myFunc(Class cls){ 
    //need to check that cls is a class which extends A 
    //i.e. B, C and E but not A or D 

    if (cls != A.class && A.class.isAssignableFrom(cls)) { 
     // ... 
    } 
} 
+0

這是迄今爲止最好的解決方案,但我會補充說,嘗試這樣做有點「代碼味道」。正如馬丁布羅德赫斯特所說,你可能想要找到一個更好的方法去做。 – 2010-11-04 20:08:35

+0

@Justin:我也意識到這一點。不幸的是,參數是'Class',並且需求指出'A.class'本身不應該通過檢查。最好的做法是使'A'抽象並應用策略模式,但這需要'A'的具體*實例作爲參數,而不是'Class '。我不確定這將如何影響OP設計的剩餘部分。也許OP有自己的理由選擇'Class'作爲參數。在我們提供更好的設計建議之前,功能需求必須更加明確。 – BalusC 2010-11-04 20:17:53

+0

這是用於實際的商業系統還是學校項目? – 2010-11-05 20:36:37

5

是的,Class.getSuperclass()正是你所需要的。

Class<?> c = obj.getClass(); 
System.out.println(c.getSuperclass() == Some.class); 
+0

你想==或等於(或者它對類對象無關緊要)嗎? – 2010-11-04 19:12:52

+2

並且對於E類,我將不得不迭代樹? – 2010-11-04 19:12:54

+2

@sprocketonline - 是的。 – Jeremy 2010-11-04 19:15:14

8

你應該儘量避免類型檢查,而不是實現B,C和E是你想要做什麼,有A和d版本做什麼函數,然後調用該函數從DoSomething的類中。

如果你做類型檢查它不是很好維護,因爲當你添加新的類時,你需要改變條件邏輯。

這就是類和重寫的問題。

0

如果你想編譯時檢查,你可以使用泛型(Java 5中及以上):

public void myFunc(Class<? extends A> cls) { 
} 

以不從繼承的任何類傳遞生成編譯時錯誤。

相關問題