2

Java組み込みクラスのすべての機能を継承するインターフェースを作成できますか?

私がやろうとしていること:

Fragment を拡張するクラスがたくさんあります。クラスには、いくつかの属性 (get、set) といくつかの関数があります。さまざまなクラスのオブジェクトを作成した後、それらを 1 つの一般的な Fragment リストに入れました。

しかし、ポリモーフィズムを導入したいと思います。1 つのインターフェイス クラスと他のすべてのクラスがそれを実装して、関数をオーバーライドできるようにします。

しかし、問題は、ポリモーフィズムを使用したい場合はインターフェイスが必要であり、インターフェイスは 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;
                   ...

したがって、「グローバルな」フラグメントを作成して、プログラムがどのクラスからどの関数を呼び出さなければならないかを自分自身で見つけられるとよいでしょう (ポリモーフィズム?)

4

5 に答える 5

1

Fragment が組み込みクラスであるという情報の後に編集されました。

根本的な質問への答えは次のとおりです。いいえ、Java では、定義済みのクラスを新しい動作で拡張することはできません (別のインターフェイスを実装するなど)。たとえば、Objective-C でそれを行うことができます。しかし、あなたの場合はそれが必要なようには見えません。

必要な動作を持つ Fragment のサブクラスを定義し、実装に必要なインターフェイスを実装し、そのサブクラスから他のクラスを派生させます。

古い答え:

あなたはすでに自分で答えを出しています:

しかし、問題は、ポリモーフィズムを使用したい場合はインターフェースが必要であり、インターフェースはフラグメントでなければならないということです

クラス ダイアグラムを今スケッチしたように、Fragment クラスにはデータもデフォルトの動作もありません。したがって、Fragment クラスを他のすべてのクラスの基本クラスにする理由はまったくありません。Fragment をインターフェースとして (必要なメソッド宣言を使用して) 定義し、そのインターフェースを実装する他のクラスを指定するだけです。

于 2013-03-12T14:14:04.307 に答える
1

もう 1 つのオプションは、Fragment を抽象化し、クラスに拡張させることです。可能であれば、いくつかの共有機能を追加することもできます。

Fragment は組み込みクラスであり、編集できないというコメントに基づいて、いくつかのオプションがあるようです。Fragment を一般的に拡張するオブジェクトを参照できます <? 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();
    }

}

フラグメント レベルでオブジェクトを参照するだけでよい場合は、フラグメントを拡張することもできます。例えば:

public class AnotherFragment extends Fragment{...}

...
public void somethingWithFragments(List<? extends Fragment> fragments){
    for(Fragment fragment:fragments){
        ...
    }
}
...
于 2013-03-12T14:00:13.743 に答える
0

フラグメントのインターフェイスを作成し、すべてのクラスがそのインターフェイスを拡張するようにする必要があります

于 2013-03-12T13:54:16.173 に答える
0

初めに。いいえ、インターフェイスはクラスを拡張できません。これにより、インターフェイスのセマンティクスが壊れます (シグネチャのみ)。

あなたができることは、「フラグメント」に新しく作成されたインターフェイスを単純に実装させることです。

于 2013-03-12T13:59:42.717 に答える
0

FragmentInterfaceそれを拡張する一般的なインターフェイスやその他のインターフェイスを作成できますFragmentInterface

基本インターフェースと、その基本インターフェースを拡張する他のインターフェースを作成できるのに、なぜ 1 つのインターフェースしか必要ないのですか?

ところで、クラスは複数の を実装することもできますinterfaces

于 2013-03-12T13:59:49.110 に答える