3

抽象クラスと具象クラスの違いはほとんどわかりません。具象クラスとは異なり、抽象クラスでインスタンスを作成することはできないことを私は知っています。抽象クラスは「abstract」メソッドを持つことができます。

しかし、私は次のような例を持っています。多くの場合、次の例が機能しています。Parentクラスで定義できるいくつかの一般的なメソッドをスキップします。

public abstract class Parent {
    public void init() {
       doInit();
    }
    public abstract void doInit();
}

public class Child extends Parent {
    public void doInit() {
       // implementation
    }
}

次のような具体的なクラスでも同じことができると思います。

public class Parent {
    public void init() {
      doInit();
    }
    public void doInit() {
       // Empty
    }
}

抽象クラスを使用しなければならない独特の状況があるかどうかを知りたいです。上記の例と実行時に大きな違いはありますか?

ありがとうございました。

4

4 に答える 4

7

この状況でクラスを使用する理由abstractは、基本クラスを継承するすべての人に抽象doInitメソッドをオーバーライドするように強制するためです。クラスとメソッドが抽象的でない場合、それらはそうすることを忘れる可能性があり、コンパイラーはそれらをキャッチしません。

この実用的な目的に加えて、抽象クラスは、設計アイデアをコードの読者に伝えるための強力な方法を提供します。抽象クラスは、モデリングしている単一の概念を実装するのではなく、内部のメソッドが関連するクラスのグループにいくつかの一般的な実装を提供することを読者に伝えます。読者にあなたの意図を伝えることは、正しいコードを書くことと同じくらい重要です。そうしないと、コードを維持している間に何かが壊れてしまう可能性があるからです。

Javaでは、抽象クラスを呼び出すのが通例Abstract...です。あなたの例では、それはですAbstractParent

于 2012-07-27T03:05:24.350 に答える
2

もちろん、そのようにすることもできますが、それはすべて適切なビジネスロジックに依存します。コードを拡張する人々にポリシーを適用したい場合があります。

たとえば、私はEmployeeクラスを作成し、ProjectManagerクラスを作成するためにクラスを拡張します。しかし、ビジネスが従業員の直接インスタンス化を許可していないと仮定します(私が言ったように、単なる例です)。したがって、私はEmployeeクラスを抽象として宣言し、それによって、クラスのすべてのエクステンダー(read:you)に、Employeeを直接インスタンス化できないというルールを適用します。(もちろん、継承チェーンを介して間接的に発生します。つまり、親オブジェクトは子オブジェクトの前に作成されます。)

適切に使用すると、場所Aの人は、場所Bの別の人がコーディングする方法を制御します。

于 2012-07-27T04:06:36.117 に答える
2

具象クラスとは、すべてのメソッドの実装(内部コード)を持つクラスです。他のクラスから派生したものかどうかは関係ありません。

public abstract class IAmAbstract{
    public void writeMe(){
        System.out.println("I am done with writing");
    }
}

public class IAmConcrete extends IAmAbstract{
    public void writeMe(){
        System.out.println("I am still writing");
    }
} 
于 2013-07-02T19:07:33.667 に答える
0

抽象クラスには、ソフトウェア設計で使用されるさまざまな便利なプロパティがあります。

インスタンス化できない、抽象メソッドを保持できるなどの明らかな違い以外。これらは、共通であるがオーバーライド可能な関数を定義し、その子を論理的に処理する静的メソッドを保持するのに役立ちます。

私のお気に入りは抽象ファクトリパターンです。

作成する可能性のあるすべてのクラスの親であるファクトリを作成することにより、作成に必要な機能を強制できます。これにより、技術的に緊密に結合されたコードが実際に保守しやすいという奇妙なアーティファクトが実際に発生します。

于 2012-07-27T03:26:05.043 に答える