2012-08-08 84 views
0

在java中,我需要防止Level1類(請看下面的示例代碼)被派生爲兩個以上的級別。直到Level2和Level3都可以派生,但如果Class是由Level4派生的,則應拋出異常。看下面的代碼示例。java如何防止類被派生超過兩個級別?

代碼示例:

class Level1 { 
    private int level = 1; 

    protected Level1() throws RuntimeException { 
     level++; 
     //System.out.println(level); 
     if (level > 2) { 
      throw new RuntimeException("Can't implement more than 2 levels"); 
     } 
    } 
} 

class Level2 extends Level1 { 
    protected Level2() { 
    } 
} 

class Level3 extends Level2 { 
    Level3() { 
    } 
} 

class Level4 extends Level3 { 
    Level4() { 
    } 
} 

從上面的代碼示例,我不使用靜態INT水平櫃檯提出解決方案。我只是想解釋這個問題。

在Java中可能通過實現一些邏輯或使用一些API,其中Level1基類可以計算它派生的級別數量?

+9

這背後的動機是什麼? – 2012-08-08 15:14:49

+1

你應該解釋這樣做的動機,否則你的問題可能會被關閉。 – 2012-08-08 15:15:44

+3

這個巨型巨型WTF代碼可以在螺旋式設計中尖叫。 – 2012-08-08 15:16:12

回答

5

自省API可以幫助你搞定,你可以試試:

protected Level1() throws RuntimeException { 
     if (getClass().equals(Level1.class)) { 
      return; 
     } 

     if (getClass().getSuperclass().equals(Level1.class)) { 
      return; // first level or inheritance 
     } 

     if (getClass().getSuperclass().getSuperclass().equals(Level1.class)) { 
      return; // second level or inheritance 
     } 
     // else 
     throw new RuntimeException("Can't implement more than 2 levels"); 
    } 

順便說一下,你爲什麼要這麼做?

+0

可能是這是一個錯誤的設計實踐。只是一個瘋狂的想法來了討論,我們希望基類(在這種情況下,級別1)控制如何得到派生,而不使用傳統的Java編碼方法,通過使類最終或使類構造函數私有。感謝您的答案和代碼解決方案。 – rashid 2012-08-08 15:45:40

9

您可以在構造函數中使用反射並遍歷this.getClass()的繼承鏈來查看嵌套級別。實際上對this.getClass()。getSuperClass()== Level1.class的測試應該已經做到了。

+0

創造力......好一個:) – Nishant 2012-08-08 15:17:48

+0

是的,這將工作得很好。應該使用反射作爲最後的手段...但使用它的情況非常有效。 – vinnybad 2012-08-08 15:18:31

+0

但是如果派生類在不調用'super()'的情況下實現其構造函數呢? – SJuan76 2012-08-08 15:19:59

3

你可以看看getClass()。getSuperclass()等來檢查你的類沒有超過N個級別。

然而,它是一個莫名其妙的要求。 :P

0

您可以使level3類最終,然後它不能被任何類擴展。一個聲明爲final的類不能被子類化。