2011-03-03 152 views
23

我有一個基類,用於我所有活動(ActivityBase),它本身來自android.app.Activity。在onCreate中,我想根據當前執行的子類執行一些條件邏輯。如果SomeCustomActivityAnotherCustomActivity都延伸ActivityBase,我怎麼能在父類(ActivityBase)確定哪兩個是當前正在執行的?從父類獲取子類名稱

+1

問題與標題不匹配。你根本不需要兒童班的名字。而是你想測試這個'this'是否是一個特定的子類的實例。 – 2011-03-03 03:36:36

+1

超類不叫「父」嗎?我聽說定義爲A的關係是B - B是父母,A是孩子。 – Rich 2011-03-03 03:45:58

+0

是的,超類被稱爲父類,但你並不特別需要知道子類的名稱,你只需要知道孩子是什麼類的實例。 – gailbear 2011-03-03 21:22:39

回答

15

使用instanceof運營商。

假如你有一個基類,並命名爲BaseSubOneSubTwo兩個子類,如果你想檢查一個變量refSubOne或實例SubTwo你會說:

if(ref instanceof SubOne){ 
} 
else if(ref instanceof SubTwo){ 
} 

注意:(ref instanceof Base)將始終返回true

+1

這不是一個面向對象的解決方案。你最好使用this.getClass()。getSimpleName()。這樣,每次引入新的子類時,您都不必修改父代碼。或者給父母一個名爲getName()的抽象方法,這樣每個孩子都會返回自己的名字。 – Evvo 2017-04-24 18:40:50

3

我想你想使用instanceof運算符,例如:

if(this instanceof SomeCustomActivity) { 
    // do stuff 
} else if (this instanceof AnotherCustomActivity) { 
    // do other stuff 
} 

,這是所有有給它。

2

而不是使用if語句,你應該爲你的條件邏輯創建一個抽象方法。然後讓子類運行正確的代碼。

這也會讓你無需每次創建新的子類時修改基類。

+1

雖然我不需要重複執行任何操作。我只想知道Activity是否應該執行某段代碼,否則跳過它。比方說,15和15不會。所有15個應該執行相同的代碼塊......應該在基類中完成,並有條件地執行它。 – Rich 2011-03-04 20:13:09

1

在你的超級類負責回答問題的條件創建方法 - 是類型X的子類之一。在處理邏輯中,使用此方法來決定執行哪個代碼塊。每個子類都可以根據需要覆蓋決策方法和答案。結果你的超類沒有關於子類的知識,而子類不需要擔心實際的處理實現。

abstract class A { 

    abstract boolean isItX(); 

    void doX() { ... } 

    void doY() { ... } 

    void process() { 
     if (isItX()) { 
      doX(); 
     } else { 
      doY(); 
     } 
    } 
} 

class B extends A { 
    boolean isItX() { 
     return true; 
    } 
} 

class C extends A { 
    boolean isItX() { 
     return false; 
    } 
} 

欲瞭解更多信息,請參閱Hollywood Principle

0

您還可以使用父母的.getClass()方法,然後檢查這樣

if(parent.getClass().equals(childObj.class)){ 
//to do .. 
} 

這基本上可行的,因爲它返回的運行對象類。 這將特別適用於抽象類 - 最近在我的項目中嘗試和測試過。