[英]Abstract class and polymorphism issue
我正在嘗試執行以下操作:
public abstract class MyBaseFragment extends Fragment {
private FloatingActionButton fab;
protected void initFab(View contentView, int resourceId) {
fab = (FloatingActionButton) contentView.findViewById(resourceId);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchDetailsDialogFragment(new Animal());
}
});
}
private void launchDetailsDialogFragment(Animal animal) {
//...
}
}
這里的關鍵點是關於制作新動物的路線。
我有各種類型的動物——貓、狗等。關於貓的頁面、關於狗的頁面等,它們都將擴展 MyBaseFragment。 因此,單擊 Cat 頁面上的 FloatingActionButton 將執行一個函數,該函數將一個 new Cat() 傳遞到 DialogFragment,您可以在其中編輯其詳細信息。 狗也一樣。 但是每個細節 DialogFragment 都有點不同,因為 Cats 和 Dogs 彼此具有不同的屬性,即使它們都是 Animals。
但是我不知道如何在這里應用多態性。 現在 MyBaseFragment 只知道它會創建一個新的 Animal,但我真的希望它創建一個新的 Cat,或一個新的 Dog 等,這取決於我擴展基礎片段的位置。
我該怎么做呢?
只需讓被調用的方法抽象廣告讓每個具體類填寫自己的實現
public abstract class MyBaseFragment extends Fragment {
private FloatingActionButton fab;
protected void initFab(View contentView, int resourceId) {
fab = (FloatingActionButton) contentView.findViewById(resourceId);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchDetailsDialogFragment();
}
});
}
protected abstract void launchDetailsDialogFragment();
}
是的,您可以使用“訪問者”模式處理對象系列: https : //en.wikipedia.org/wiki/Visitor_pattern
使launchDetailsDialogFragment
抽象:
protected abstract void launchDetailsDialogFragment();
並在您想要的子類中實現它。
你必須讓 MyBaseFragment 特定的實現決定在啟動細節片段時實例化哪個動物。 據我所知,MyBaseFragment 抽象類只知道應該有一個細節片段應該在 fabbutton 的點擊事件上啟動,它不知道應該啟動的fragment的類型。這將由fragment的具體實現決定。 因此,將負責創建 detailfragment 的方法標記為受保護的抽象,並在特定實現中覆蓋它們以創建特定動物。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.