web-dev-qa-db-ja.com

なぜJavaの抽象クラスが必要なのですか?

なぜJavaの抽象クラスが必要なのですか?あなたがそれをオブジェクトにするつもりがないなら、なぜそもそもそれがあるのですか?どんなふうに使うの?なぜそこにあるのですか?抽象メソッドでも同じことを考えています。私は、サブクラスを持たないスーパークラスを作成することは問題ではないのに似た概念のように思えます。

17
user3314801

抽象クラスは、他のクラスのテンプレートのタイプとして使用できます。抽象クラスは、それを拡張するすべてのクラスに共通の機能を保持します。

例えば:

Abstract Class Animal 

すべての動物は動き、呼吸し、繁殖するため、これらは動物クラスに入れることができます。

いま

 Concrete Class Dog, Cat etc.

これらの基本機能は既に提供されています。

30
Scary Wombat

抽象クラスは、クラス内のメソッドのデフォルト実装のpartialセットの提供を許可します。それらは不完全であるため、インスタンス化してそのまま使用することはできませんが、特定の実装に固有の方法で不足している詳細を追加するためにサブクラス化することができ、それらのサブクラスをインスタンス化できます。

抽象クラスがなければ、オーバーライドするメソッドのダミー実装を提供する必要がありますが、これは実行できますが、そのうちの1つを実装し忘れるリスクがあります。一部のメソッドを完全に抽象のままにしておくことで、実際の実装がギャップを埋める必要があります。または、抽象のままであり続けて、子孫にそうするよう強制します。

それは言語なしでは生きていけないものではありません。しかし、それは非常に便利です。 Java and OO design。

(基本的に、前回この質問を提起したときに同じことを言ったことに注意してください。それでも、まだ混乱している場合は、何が混乱しているかについてより具体的にしたいかもしれません。)

16
keshlam

抽象クラスの多くの使用法は、抽象クラスの主な目的は、サブクラスによって拡張されて完全な実装を作成できる基本クラスとして機能することです。

例えば、

プログラムに実装する3つのステップがある場合がありますが、

  • アクション前のいくつかのステップ
  • 実行するアクション
  • アクション後のいくつかのステップ

したがって、この場合、次のような3つのメソッドを使用して抽象クラスを定義できます。

public abstract MyAbstractProcess {
    public void stepBefore() {
        //implementation directly in abstract superclass
    }

    public abstract void action(); // implemented by subclasses

    public void stepAfter() {
        //implementation directly in abstract superclass
    }
}

また、上記の抽象クラスAnimalの例も非常に良い例です。

12
Harish Talanki