8

すべての例で、インターフェースがポリモーフィズムを実現するために使用されていることを確認しました。これで、抽象クラスを使用した次のコードができました

AbstractClass parent = new Child();

ここで男は言いました。

一般的な議論は、ポリモーフィズムはインターフェースにのみ適用され、抽象クラスには適用されないというものです。

彼は通常、Java のポリモーフィズムで使用されるインターフェイスを意味していたと思います。私が見るように、多くの人が彼の質問をばかげていると感じ、URL を求めていました。これは私が見つけたものです。だから私の質問は、Javaでポリモーフィズムで抽象クラスを使用することは良い/一般的な方法ですか? (私の例のように-ポリモーフィズムは非常に広い定義であるため)

4

7 に答える 7

4

コントラクトを満たす最も一般的な親を使用することをお勧めします。インターフェイスが必要なすべての関数シグネチャを定義している場合は、そのインターフェイスを実装する抽象クラスではなく、それらを使用します。Bill Venners が Erich Gamma と議論しているDesign Principles from Design Patternsという記事で詳細が説明されています。

于 2013-11-08T13:04:40.180 に答える
1

それらの最適な用途の 1 つは、「子」間で共通の動作を行う場合です。

あなたのインターフェース

interface Drawable{
    void paint();
}

共通コードを持つ抽象クラス

abstract class AbstractRectangularObject implements Drawable{

    public void paint(){
         paintVertices();
         //your code to fill body
    }

    //Abstract method that all subclases needs to implement
    protected abstract void paintVertices();

}

あなたの本当のサブクラス

class Rectangle extends AbstractRectangularObject {
     protected void paintVertices(){
         //code to pain vertices
     }
}

-

class RoundRectangle extends AbstractRectangularObject {
     protected void paintVertices(){
         //code to pain vertices
     }
}
于 2013-11-08T13:07:37.557 に答える
0

答えは文脈によって異なります。

例:

 // Abstract class template
abstract class AbstractFirst {
  public void doSomething(){
    this.doOne();
    this.doSecond();
    System.out.println("");
    System.out.println("Test");
  }
   public abstract void doOne();
   public abstract void doSecond();
}

// Concrete implementation
class ConcreteFirst extends AbstractFirst {
   public void doOne(){System.out.print("One"); }       // must be implemented
   public void doSecond(){System.out.print("Second"); } // must be implemented

   public static void main(String[] args){
       ConcreteFirst cf = new ConcreteFirst();
       c.doSomething();
   }
}

これは印刷します

OneSecond 
Test

慰める。これは、インターフェイスでは不可能です。このパターンは「テンプレート メソッド パターン」と呼ばれ、GoF パターンの 1 つです。

于 2013-11-08T13:14:51.593 に答える
0

子クラス間で共有する共通の機能とプロパティがあり、同時にクラス自体が抽象的すぎてインスタンスを持つことができない場合は、抽象クラスを使用することをお勧めします。いいえの場合は、インターフェイスを使用することを好みます。

于 2013-11-08T13:07:16.347 に答える