10

重複の可能性:
「インターフェイスにプログラムする」とはどういう意味ですか?
インターフェイス vs 抽象クラス (一般的なオブジェクト指向)

私はJAVAを学ぶのが初めてで、インターフェースについて混乱しています。多くの資料を検索して読みましたが、まだ明確ではありません。

インターフェイスに関する情報を探していると、多くの人がインターフェイスと抽象クラスの関係について話しているのを目にします。しかし、なぜこの 2 つが対比されるのか、私にはわかりません。抽象クラスは、この抽象クラスのオブジェクトを作成することはできず、必要に応じて抽象クラスを変更する必要があることを他の人に伝えるために使用されると思うからです。これは継承に関するものですよね?

しかし、インターフェイスの意味がわかりません。があり、interface aaclass Bがインターフェイス a を実装する場合は、予約語class B implements aを使用し、インターフェイスが必要とするすべてのメソッドを完了する必要があります。しかし、私の質問は、クラス B がすべてのメソッドを単独で完了する必要がある場合、インターフェイスの意味は何ですか? 必要ないと思います。よくわかりません。「インターフェイスはオブジェクト指向言語の中心的な考え方を反映できる」、「インターフェイスはプログラムをより簡単にするのに役立つ」などの文章をたくさん読みました。しかし、私はその意味をよく理解できません。

それで、インターフェースを理解できるようにするための例を誰かに見せてもらえますか? または、インターフェイスを明確に説明している便利なリンクや書籍を教えてください。私はそれを理解することを本当に望んでいます。ありがとう!

4

5 に答える 5

10

実生活では無関係なクラスとクラスがあり、 と呼ばれる共通の動作があるとしCarます。車も洗えるし、野菜も洗えるから。しかし、洗車と野菜洗いはまったく別のプロセス/行動です。Vegetablewash()

例:台所の流しの下でCar電動ポンプで洗ってください。Vegetablesそのため、洗い方が異なります。したがって、洗浄プロセスをwash()インターフェースのメソッドとして作成し、それらをクラスとクラスWashableの両方に実装します。CarVegetable

interface Washable {

 public void wash();

} 

public class Car implements Washable {

 public void wash() {

   // wash the car with a power pump

 }


}

public class Vegetable implements Washable {

public void wash() {

   // wash the vegetable under a kitchen sink

 }


}

人として、野菜だけでなく車も洗いたいと思うでしょう。

public class Person  {


Washable washableObject = new Car();

washableObject.wash();

washableObject = new Vegetable();

washableObject.wash();




}
  1. したがって、インターフェイスは、共通の動作を持つ無関係なクラスを接続する方法です。ただし、動作は異なる方法で実装されるか、将来変更される可能性があります。

  2. ある日、あなたは洗車方法を変えようと決心しました。例えば、「洗車機」を購入したとします。したがって、クラスのメソッド内で実装が変更されwash()ますCar

    public class Car はウォッシャブルを実装します {

      public void wash() {
    
       // wash the car with my new car washing machine !!
    
     }
    

    }

ただし、 Person として、wash()メソッドを呼び出します。メソッドのwash()実装方法が変更されました (新しい洗車機で車を洗う)。この実装の変更はPersonクラスに影響しませんでした。

なぜ私たちがinterfaces今使用するのかが明確であることを願っています.

于 2012-10-21T05:39:04.117 に答える
1

基本的に、interface実際に行う必要なく多重継承を実現する方法です。(これは、Java の人々が「失敗した」と言っているわけではありません。多重継承は非常に面倒で、実装が非効率的です。)

これが意味することは、 以外Objectに共通の祖先を持たない 2 つの完全に別個のクラス A と B を持つことができ、それらが同じ を実装する場合、interface一方を他方に置き換えることができるということです (インターフェースでメソッドのみを参照する限り)。 .

于 2012-10-20T22:12:44.557 に答える
1

クラスとユーザーの間のコントラクトのようなインターフェイスを考えてください。クラスがインターフェースを実装するとき、インターフェースによって定義されたすべてのメソッドを提供することを約束していることを伝えています。

于 2012-10-20T22:12:58.400 に答える
1

クラスの継承を理解していると仮定すると、インターフェイスは、クラスの構造が記述されているが実際に記述/実装されていないスケルトン クラスのようなものだと思います。

別のクラスは、特定のインターフェイスがまだ実装されていない場合でも、特定のインターフェイスを実装する任意のクラスと連携できます。

たとえば、誰かが というインターフェイスを作成したとしAnimalます。そのメソッドはおそらく: Talk()Walk()およびEat(). メソッドが呼び出されたときに「横糸」を出力Dogすることを実装するクラスを作成できます。したがって、別のクラスは、Animal インターフェースを実装するすべてのクラスを操作する方法を知っています。AnimalTalk()

UPD

実際の良い例は、JDBC Database Statement Interface です。これにより、データベース メーカーが実装する必要があるいくつかの必須プロパティが設定されexecute(String sql)ます。Oracle はこれを Postgresql とは異なる方法で実装します。これにより、データベースを別のデータベースに交換できますが、ユーザー コードは同じままです。

于 2012-10-20T22:26:15.893 に答える
1

インターフェイスとクラスを理解するための簡単なコード。

import java.util.List;
import java.util.ArrayList;
public class Q01 {
List<Shape> shapes= new ArrayList();

public void add() {
    shapes.add(new Square(3.0));
    shapes.add(new Circle(2.0));
}
public void print() {
    for (int i = 0; i < shapes.size(); i++) {
        Shape shape = shapes.get(i);
        System.out.println(shape.getClass().getSimpleName() + " --->" + shape.getArea());
    }
}

public static void main(String[] args) {
    Q01 q01= new Q01();
    q01.add();
    q01.print();
}

public interface Shape {
    double getArea();
}

public class Square implements Shape{
    private double edge;

    public Square(double edge) {
        this.edge = edge;
    }
    public double getArea() {
        return edge*edge;
    }
}
public class Circle implements Shape{
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    public double getArea() {
        return 3.14 * radius * radius;
    }
}
}
于 2012-10-20T22:27:51.200 に答える