1

基本的に、同じことを行ういくつかのメソッドが必要ですが、サブクラスが選択できるパラメーターが異なり、それでも実装を強制します。これは正しいアプローチ/設計ですか?

編集: addItem() 本体を編集しました。これらのメソッドには、渡されたパラメーターを処理するために使用される最終的なロジックが含まれています

public abstract Class A {
    public abstract void addItemImpl()

    addItem(String s) {
        // do stuff
    }
    addItem(Collection c) {
       // do stuff
    }
    addItem(Item item) {
        // do stuff
    }
}

public  Class B extends A {
    addItemImpl() {
        addItem("text, text2")
    }
}

public Class C extends A {
    addItemImpl() {
        addItem([item, item2])
    }
}
4

4 に答える 4

2

いいえ、これは機能しません。

パラメータを処理する必要があるため、「doStuff()」メソッドを定義することはできません。詳細なヘルプを提供するのに十分な情報を提供していません。しかし、ジェネリックが便利になる可能性があります。

public abstract Class A<T> {
    public addItem(T t) {
        // dostuff with t
    }
}

public  Class B extends A<String> {
}

public Class C extends A<Collection> {
}
于 2012-08-17T16:03:51.107 に答える
1

これは、次の場合に最適です。継承よりも構成を優先します。

サブクラスはスーパークラスの恩恵を十分に受けておらず、その実装の詳細に依存していません。次に、コントラクトのインターフェースを定義し、 ( )に従い、。で構成する必要がBあります。CaddItemImpl()A

自問してみてください:本当に本当にBACA

于 2012-08-17T16:09:07.810 に答える
1

あなたが持っているものは技術的には正しいですが、addItem実際に何をするのかを知らなければ、これが最善の解決策であるかどうかを知ることは困難です. 私の推測では、おそらくもっと良い方法があると思います。

addItem基本的に値を doStuff で使用するように設定する場合は、代わりにクラスでその作業を行いBますCBの代わりにそれを拡張できるのと同じ方法でそれを行う必要がある他の人A.

編集:あなたの編集に基づいて、これはおそらく抽象クラスを使用する悪い例だと思います。真に共有される機能はありません。それぞれに異なる実装が必要なため、インターフェイスの方が適切です。抽象クラス内にそれを隠そうとしているだけです。Aジェネリックを使用するとともに、インターフェイスに変更します。

(上記のように) 動作させるためのトリックを実行する必要なく、すべてのクラスでまったく同じ共有コードが実際に存在する場合にのみ、抽象クラス ルートに進みます。

于 2012-08-17T16:02:50.163 に答える
0

いくつかのメソッドの強制実装が必要な場合は、Abstractメソッドが理想的です。

ただし、スーパークラスの最初の サブクラスのみが、その中にすべての抽象メソッドを実装するようにバインドされていることに注意してください。Non-Abstract

于 2012-08-17T15:58:00.510 に答える