簡體   English   中英

Java內置類到接口

[英]Java built-in class to interface

你能創建一個繼承java內置類所有功能的接口嗎?

我正在嘗試做的事情:

我有很多擴展 Fragment 的類,在這些類中有一些屬性(get、set)和一些函數。 在創建不同類的對象后,我將它們放在一個通用 Fragment 列表中。

但我想介紹多態:1 個接口類和所有其他類都實現了它,以便它們可以覆蓋函數。

但是問題是,如果我想使用多態,我需要一個接口,並且接口應該是一個 Fragment 這樣我仍然可以將這些 Fragment 放入一個列表中,那么我可以從 Fragment 類創建一個接口還是接口可以繼承從碎片?

在圖像上你可以看到當前的情況

當前的

更新

這是一些代碼來顯示我想要實現的目標:

所以我的主函數是一個 xmlSAXParser,當我遇到一個標簽時,我創建了一個正確類的對象:

case template:
        switch (typeObjecten.toType(atType)) {
        case NOVALUE:
            break;
        case chapter:
            chapter = new ChapterFragment();
            typeObject = "chapter";
            break;
        case execute:
            execute = new ExecuteFragment();
            typeObject = "execute";
            break;
        case first:
            first = new FirstFragment();
            typeObject = "first";
            break; 
                              ...

當我找到結束標簽時,我將正確的對象添加到列表中:

case template:
        switch (typeObjecten.toType(typeObject)) {
        
        case NOVALUE:
            break;
        case chapter:
            fragments.add(ownFrag);
            break;
        case execute:
            fragments.add(execute);
            break;
        case first:
            fragments.add(first);
            break;
        case navigation:
            fragments.add(navigation);
            break;
        case story:
            fragments.add(story);
            break;
                          ....

也有可能在每個類中背景都可能發生變化,現在我必須檢查對象要調用哪個類來調用正確的函數:

case background:
        
        if (typeObject.equalsIgnoreCase("navigation")) {
            navigation.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("chapter")) {
            //chapter.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("first")) {
            ownFrag.setBackgroundColor("#" + text);
            first.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("execute")) {
            execute.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("story")) {
            story.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("intro")) {
            intro.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("mission")) {
            mission.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("question")) {
            question.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("info")) {
            info.setBackgroundColor("#" + text);
        }
        break;
                   ...

因此,如果我可以創建一個“全局” Fragment 然后程序自己找出它必須調用哪個類的哪個函數(多態?)

另一種選擇是使 Fragment 抽象並讓您的類擴展它。 然后,如果可能,您還可以添加一些共享功能。

根據您評論 Fragment 是一個內置類並且不可編輯,似乎有幾個選項。 您可以引用擴展 Fragment 一般的對象 <? extends Fragment> 或者通過在 Fragment 上創建一個包裝類來保存和維護它的一個實例。 這會給你更多的控制。

一個簡單的例子可能如下所示。

class CannotModify{
    public void doSomething(){}
}




public interface AddThisIfYouWant{
    public void doSomething();
}




public class Wrap extends CannotModify, implements AddThisIfYouWant{
    private final CannotModify yourInstance;

    public Wrap(){
        this.yourInstance=new CannotModify();
    }

    @Override
    public void doSomething(){
        super.doSomething();
    }

}

如果您只需要在 Fragment 級別引用您的對象,您也可以只擴展 Fragment。 例如:

public class AnotherFragment extends Fragment{...}

...
public void somethingWithFragments(List<? extends Fragment> fragments){
    for(Fragment fragment:fragments){
        ...
    }
}
...

在 Fragment 是內置類的信息之后編輯。

您的基本問題的答案是:不,在 Java 中,您不能使用新行為擴展預定義的類(例如,使其實現另一個接口)。 例如,您可以在 Objective-C 中做到這一點。 但在您的情況下,您似乎不需要它。

定義 Fragment 的子類,它具有您需要的行為,並實現您需要它實現的接口,並從該子類派生其他類。

舊答案:

你自己已經給出了答案:

但問題是,如果我想使用多態,我需要一個接口,並且接口應該是一個 Fragment

正如您現在繪制的類圖一樣,Fragment 類沒有數據也沒有默認行為,因此完全沒有理由讓它成為所有其他類的基類。 只需將 Fragment 定義為一個接口(帶有您需要的方法聲明),並為其他類指定它們實現該接口。

您應該為 Fragment 創建一個接口並使所有類都擴展該接口

首先。 沒有接口不能擴展類,這會破壞接口的語義(只有簽名)。

你可以做的是讓“片段”簡單地實現新創建的接口。

您可以創建一個通用的FragmentInterface和其他擴展該FragmentInterface接口。

當您可以制作基本接口和擴展該基本接口的其他接口時,為什么只需要 1 個接口?

順便說一句,一個類也可以實現多個interfaces

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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