2012-07-12 91 views
0

如果我擴展了Activity並在我的基類中實現了一個事件處理程序(對不起,如果這不是正確的OOP術語),我如何確保我的事件處理程序總是從類延長我的。確保在擴展活動後調用事件偵聽器

public class MyActivity extends Activity{ 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
//Stuff that I need to do. 
} 

}//MyActivity class 

public class MainActivity extends MyActivity{ 


protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
} 

}//MainActivity class 

意圖是,MyActivity將最終在其他用戶將使用的代碼庫中。 我的班級和擴展班級的活動實例都有單獨的有效用途onActivityResult。我顯然不能讓onActivityResult決賽來阻止人們超越它。

現在,如果用戶忘記添加該超級語句,我的代碼不會運行。有沒有辦法強制擴展MyActivity的類的實例在父類中由我定義的方法重疊的方法中運行超類。

+1

這個問題可能會有幫助:http://stackoverflow.com/questions/4217013/how-to-force-derived-class-to-call-super-method -like-android-does – fiddler 2012-07-12 15:41:20

回答

2

如果後來的程序員選擇不要致電super那麼這是他們的決定,他們將失去繼承自班級的好處。據我所知,沒有辦法保證super將被調用或以任何方式強迫他們打電話給它。

+0

ok,但是說出你的基本活動是否打開了一些資源,並且擴展了這個活動並使你的基本活動對庫中的其他活動可用。然後你沒有確定的方式來確保你的資源清理代碼被執行。 – user1325094 2012-07-16 07:39:44

+1

好點。我想我最好的建議是:也許你的基地活動不應該開放它無法關閉的資源。我不是設計模式專家,但這是我能提供的最好的。您可以嘗試將一個受保護的getter留給該資源,以便覆蓋類可以訪問它,然後留下明確的文檔,以便將來的類必須處理它(或至少稱爲超級類)。 – eternalmatt 2012-07-16 15:38:59

1

據我所知,你不能強制超級方法被調用。

但是,您可以通過這種方式開發MyActivity,以便更容易理解開發人員應該如何使用它。

如果您的父類MyActivity永遠不會被實例化,您可以將其設爲抽象類。

抽象類可以包含可以調用抽象方法的方法。

抽象方法必須在擴展它的類中實現。

所以你可以編寫類似

public abstract class MyActivity extends Activity{ 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    //Stuff that I need to do. 
    onMyActivityResult(requestCode, resultCode, data); 
} 

public abstract void onMyActivityResult(int requestCode, int resultCode, Intent data); 

}//MyActivity class 

public class MainActivity extends MyActivity{ 

@Override 
public void onMyActivityResult(int requestCode, int resultCode, Intent data) { 
} 

}//MainActivity class 
+0

我不知道你得到了我想要做的。我想確保我的代碼在基類中獲得調用,但是如果MainActivity中的onActivityResult沒有super.onActivityResult語句,那麼基類中的事件處理程序不會被調用。 – user1325094 2012-07-16 07:47:47

+0

據我所知,其他答案是正確的,沒有辦法做到這一點。相反,我給出的答案是一種替代解決方案 - 您給他們一個他們必須執行的不同方法。你不能阻止他們重寫onActivityResult,但是如果你給他們另一個他們必須實現的方法,允許他們去做onActivityResult,那麼至少其他開發人員將能夠做到他們需要並且將被迫理解爲什麼onMyActivityResult存在。 – Scen 2012-07-16 17:47:54

+0

我編輯了我的答案,以澄清我的迴應。 – Scen 2012-07-16 17:50:51