1

抽象親クラスからメソッドを宣言するために、次のスタイルのいずれかを他のスタイルよりも使用することの長所/短所は何ですか。

オプション1:

親クラス:

protected Object retrieve(String id, Object model){
        return null;
}

子クラス:

@Override
public String retrieve(Object model) {
    if (model instanceof Car)
        // ... somehow get id ...
        return getInfo(id, (Car)model);
    return null;
}

また...

オプション2:

親クラス:

protected abstract Object retrieve(String id, Object model);

子クラス:

public String retrieve(String id, Object model) {
    if (model instanceof Car)
        return getInfo(id, (Car)model);
    return null;
}
4

4 に答える 4

4

抽象クラスを使用すると、子が抽象メソッドをオーバーライドすることが保証されます(存在する場合)(またはそれ自体が抽象である場合)。また、インスタンス化することもできません。これは、機能が不足しているため重要です(抽象メソッド)。

http://wiki.answers.com/Q/Use_of_abstract_class_in_javaも参照してください。

抽象クラスはインターフェースに似ています。それらをインスタンス化することはできませんが、拡張することはできます。抽象クラスを拡張するクラスはすべて、抽象メソッドに実装を提供する必要があります。したがって、これらのクラスは、いくつかの一般的な機能が必要になる可能性がある同様のクラスのスケルトンとして使用できます。このような機能は、これらのクラスに組み込むこともできます。インターフェイスとは異なり、抽象クラスはメソッドコードも持つことができます。とても便利です。

これも役立つ場合があります:https ://softwareengineering.stackexchange.com/questions/96947/why-should-i-declare-a-class-as-an-abstract-class

于 2013-01-03T02:32:54.017 に答える
3

私の意見では、最初のスタイルが必要になるのは、すべてのサブクラスがこの関数を実装しない場合のみです(インターフェイスでより適切に表現できると考えられます)。それが必要な関数である場合、コンパイラーがそれを実装するように要求するので、抽象的であり、エラーが発生しにくいと言う方が明確です。

于 2013-01-03T02:32:56.173 に答える
1

ここではリンゴとオレンジを混ぜていますが、おそらくもう少し:

  • @Overrideコンパイル時(@Retention(value=SOURCE))、メソッドレベル(@Target(value=METHOD))アノテーションであり、指定されたメソッドが次のいずれかであることを確認するためにコンパイラによって使用されます。
    • interface(注:JDK 1.6+)からのメソッドを実装する、または
    • クラスabstractからメソッドを実装する、またはabstract
    • final親クラスの非メソッドをオーバーライドします(その親クラスがそうであるかどうかに関係abstractなく)。
  • abstractクラスレベルまたはメソッドレベルで宣言できる 言語キーワードです。
    • クラスレベルの場合、これはこのクラスを直接インスタンス化できないことを意味するため、サブクラス化する必要があります(ただし、このようなabstractクラスstatic、それ自体のサブクラスを返すファクトリメソッドを持つことができます)。
    • メソッドレベルの場合、メソッドにはプロトタイプのみがあり(以下を参照)、サブクラスはこのメソッドを実装する必要があります。

abstractクラス自体がそうでない場合、メソッドをあると宣言することは違法であることに注意してくださいabstract

また、これが可能であることに注意してください。

public abstract class MustHaveToString
{
    // .toString() is implemented in Object, here we FORCE children of that class
    // to re-implement it. As the method is abstract, we only declare its 
    // prototype (its return type and method arguments, in this case, none).
    // As the method originates from one of our parents (Object), 
    // we can also @Override it!
    @Override
    public abstract String toString();
}
于 2013-01-03T02:42:59.850 に答える
1

まず、オプション「1」はメソッドのオーバーロードの例です。次に、メソッドのオーバーライドを意味していると仮定すると、オプション「1」では、オーバーライドされたメソッドからいつでも「super.method」を呼び出すことができます。これは、オプション「2」では技術的に許可されていません。したがって、これら2つの手法の「長所」または「短所」はありません。

(「abstract」を宣言せずに)「オプション2」へのより近いアプローチは次のとおりです。

public abstract class Parent {
  protected Object retrieve(String id, Object model) {
    throw new UnsupportedOperationException(...);
  }
}
于 2013-01-03T02:54:10.607 に答える