簡體   English   中英

抽象類和多態問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM