5

私はこのようなスーパークラスを持っていますが、多くのクラスが継承することを期待しています:

public abstract class Super {
    protected Object myField; //Not used anywhere in this class
    //a load more code here which does useful stuff
}

これらのクラスはすべて、のインスタンスを使用する必要がありますmyField。ただし、スーパークラスはそうではありません。私はどこかで悪い設計上の決定をしましたか?

4

7 に答える 7

6

必ずしも。すべてのサブクラスが同じ理由で同じフィールドを必要とする場合、それは基本クラスで他の一般的な機能を提供することと同じです。クラスが大きくなるにつれて、このフィールドを使用する一般的な機能を追加することに気付く場合があります(equals / hashCodeメソッドでの参照など)。

ここで、フィールドのタイプがObjectであり、各サブクラスがまったく異なるものをそのフィールドに押し込んでいる場合、コードの臭いがあると考えられます。

于 2012-09-06T14:09:03.263 に答える
5

私見ですが、フィールドが実際にそのクラスで使用されていない場合は、そのクラスにフィールドを含めるべきではありません。ここで本当に必要なのは、サブクラスに「Xの状態を維持するための何らかの方法が必要ですが、私(基本クラス)はそのX状態を変更しない、その場合はそのメッセージを伝えるために、次のような抽象的なメソッドを作成する必要があります。

public abstract class Super {
    protected abstract Object getMyField();
}
于 2012-09-06T14:14:30.753 に答える
3

このような漠然とした説明で言うのは難しいですが、一般化して、いくつかの一般的なコードをスーパークラスにプッシュできるように思われます。サブクラスがフィールドと同様のことをしている場合、いくつかの共通点が見つかる可能性があります(テンプレートメソッドまたは戦略を使用してサブクラス固有の違いを処理します)。そうでない場合、すべてのサブクラスがそれと異なることをしている場合、共通フィールドを使用する意味は何ですか?

于 2012-09-06T14:12:06.167 に答える
2

いいえ、そうは思いません。抽象クラスはその目的を果たします(基本クラスに共通の機能を持ち、サブクラスに特定の必要な機能のみを実装させます)。

于 2012-09-06T14:09:40.883 に答える
2

したがって、クラスでそのフィールドを使用しない場合、Superなぜそこで必要になるのでしょうか。

おそらく、スーパークラスは、このフィールドと一般的な方法で対話するためのインターフェイスを提供します。たとえば、次のようになります。

public abstract class Super<T> {
    protected T myField; 

    public T getField() {
        return myField;
    }
}

public class Child extends Super<String> {
    public Child( String label ) {
        super.myField = label;
    }
}
于 2012-09-06T14:15:20.767 に答える
1

このtuturialで述べたように

保護されたフィールドまたはメソッドは、クラス自体、そのサブクラス、および同じパッケージ内のクラスにアクセスできます。

これは、保護されたフィールドがこれらの特性を持つように正確に設計されていることを意味します。

于 2012-09-06T14:13:30.083 に答える
1

軽いメモでThe only thing common in your hirarchy is one field then you should get rid of abstract class and Create one Marker Interface.

于 2012-09-06T15:02:05.157 に答える