0

私は Java を始めたばかりで、オンラインで例を調べています: http://docs.oracle.com/javase/tutorial/java/IandI/usinginterface.html

次に、その背後にある概念を理解しながらインターフェイスを実装するようになりましたが、インターフェイス宣言ではそれを定義するだけであり、このインターフェイスを実装するクラスではまだ関数を記述する必要があるため、奇妙に思えます. では、なぜそれを使用するのでしょうか。

サンプル コードを試してから、インターフェイスを削除するようにコードを変更しましたが、どちらも同じように動作します。だから私の質問は、いつインターフェースを実装するのですか? 私には不必要に見えます。前もって感謝します!

オンラインのサンプル コード:

public class RectanglePlus 
    implements Relatable {
    public int width = 0;
public int height = 0;
public Point origin;

// four constructors
public RectanglePlus() {
    origin = new Point(0, 0);
}
public RectanglePlus(Point p) {
    origin = p;
}
public RectanglePlus(int w, int h) {
    origin = new Point(0, 0);
    width = w;
    height = h;
}
public RectanglePlus(Point p, int w, int h) {
    origin = p;
    width = w;
    height = h;
}

// a method for moving the rectangle
public void move(int x, int y) {
    origin.x = x;
    origin.y = y;
}

// a method for computing
// the area of the rectangle
public int getArea() {
    return width * height;
}

// a method required to implement
// the Relatable interface
public int isLargerThan(Relatable other) {
    RectanglePlus otherRect 
        = (RectanglePlus)other;
    if (this.getArea() < otherRect.getArea())
        return -1;
    else if (this.getArea() > otherRect.getArea())
        return 1;
    else
        return 0;               
}
}

私が変更したコードは、インターフェースを取り出しましたが、それでも同じように動作します

public class RectanglePlus {
public int width = 0;
public int height = 0;
public Point origin;

// four constructors
public RectanglePlus() {
    origin = new Point(0, 0);
}
public RectanglePlus(Point p) {
    origin = p;
}
public RectanglePlus(int w, int h) {
    origin = new Point(0, 0);
    width = w;
    height = h;
}
public RectanglePlus(Point p, int w, int h) {
    origin = p;
    width = w;
    height = h;
}

// a method for moving the rectangle
public void move(int x, int y) {
    origin.x = x;
    origin.y = y;
}

// a method for computing
// the area of the rectangle
public int getArea() {
    return width * height;
}

// a method required to implement
// the Relatable interface
public int isLargerThan(RectanglePlus otherRect) {

    if (this.getArea() < otherRect.getArea())
        return -1;
    else if (this.getArea() > otherRect.getArea())
        return 1;
    else
        return 0;               
}

public static void main( String[] args )
{

    RectanglePlus newRect = new RectanglePlus(20, 30);
    RectanglePlus somerect = new RectanglePlus(50, 100);

    System.out.println("Area of newRect is " + newRect.getArea());

    System.out.println("Area of somerect is " + somerect.getArea());

    if((newRect.isLargerThan(somerect))==1)
    {
        System.out.println("newRect is bigger");
    }
    else
    {
        System.out.println("somerect is bigger");
    }

}

}
4

3 に答える 3

2

2 つの理由:

  1. インターフェイスの実装が複数ある場合。がありShape、サブタイプがRectangleOvalなどであるとします。一般に形状で何かを実行できるコードを記述したい場合は、すべてのサブタイプが実装するインターフェイスが必要です。インターフェイスは、いずれかShapeが持つことがわかっているメソッドのセットです。

  2. API を作成している場合は、他の誰かが使用するライブラリを作成しています。あなたは他の人々にインターフェースを提供します - これは彼らが呼んでも問題ないものです。インターフェイスを実装し、実装クラスにはさらに多くのメソッドが含まれる場合があります。これらのメソッドを後で変更できるようにしたいと考えていますが、ユーザーはライブラリの新しいバージョンを取得して古いコードで使用できる必要があります。 . インターフェースを実装から切り離すことで、パブリックに使用できるものを提供しますが、既存のユーザーを傷つけることなく変更できるものを保持します。

于 2013-10-14T07:07:35.663 に答える
0

これは、型/インターフェイスの再利用を容易にするためです。親タイプのオブジェクトが必要な場所に、サブタイプのオブジェクトを渡すことができます。http://www.oodesign.com/liskov-s-substitution-principle.htmlを参照できます。

これにより、基本的に抽象的な方法で対処できます。プログラムは、特定の動作を実装する (またはインターフェイスを実装するか、クラスから拡張する) 限り、さまざまなクラスのオブジェクトを処理できます。

于 2013-10-14T06:52:00.523 に答える
0

実装Relatableすると、Relatable を実装するクラスからインスタンス化されたすべてのオブジェクトについて、オブジェクトのペアで最大のオブジェクトを見つけることができます。そうしないと、同じクラスからインスタンス化されたオブジェクトのペアで最大のオブジェクトしか見つけることができません。

于 2013-10-14T06:58:21.397 に答える