3

コード 1:

public class User1 implements MyInterface
{
    @Override
    public void doCalculation() { }
}

public class User2 implements MyInterface
{
    @Override
    public void doCalculation() { }
}

interface MyInterface
{
    public void doCalculation();
}

コード 2:

public class User1
{
    public void doCalculation() { }
}

public class User2
{
    public void doCalculation() { }
}

ここで私のコード 1MyInterfaceは、空のメソッドがありますdoCalculation()。これdoCalculation()は、 を実装することで user1 と user2 によって使用されますMyInterface

コード 2のように、doCalculation()メソッドが定義された 2 つの異なるクラスがあります。

code1 と code2 のどちらの場合も、私自身が実装を作成する必要があります。私のメソッドdoCalculation()は空のメソッドです。

MyInterfaceでは、ここの用途は何ですか?

  1. メソッド名またはスケルトンのみを提供します(それがインターフェースの唯一の利点ですか)?

  2. または、使用中にメモリを節約できますMyInterfaceか?

  3. つまり、それを実装するクラスに空のメソッドを提供するだけなので、コード2で行ったように自分で定義してみませんか.

  4. それ以上に、インターフェイスを使用する利点があります。

4

9 に答える 9

3

インターフェースは基本的に、クラスができるべきことの青写真であるため、よく使用されます。

たとえば、キャラクターを使ってビデオ ゲームを作成している場合、キャラクターが持つべきすべてのメソッドを保持するインターフェイスを使用できます。

例えば

public interface Character {
    public void doAction();
}

そして、味方と敵の 2 人のキャラクターがいます。

public class Ally implements Character {
    public void doAction() {
        System.out.println("Defend");
    }
}

public class Enemy implements Character {
    public void doAction() {
        System.out.println("Attack");
    }
}

ご覧のとおり、どちらのクラスもインターフェイスを実装していますが、アクションは異なります。これで、インターフェイスを実装するキャラクターを作成し、そのアクションを実行させることができます。敵か味方かに応じて、異なるアクションを実行します。

public Character ally = new Ally();
public Character enemy = new Enemy();

メイン プログラムでは、インターフェイスを実装する任意のオブジェクトを受け入れるメソッドを作成し、それがどのような種類の文字であるかを知らなくても、そのアクションを実行させることができます。

void characterDoAction(Character char) {
    char.doAction();
}

このメソッドに ally を指定すると、出力は次のようになります。

Defend

このメソッドに敵を与えると、出力は次のようになります。

Attack

これが、インターフェースを使用する利点を理解するのに役立つ十分な例であったことを願っています。

于 2013-06-25T11:05:55.417 に答える
2

インターフェイス駆動型プログラミングには多くの利点があります。

「実装ではなくインターフェースへのプログラム」とはどういう意味ですか?

基本的に、インターフェイスでコントラクトを定義しており、インターフェイスを実装するすべてのクラスはコントラクトに従う必要があります。

質問への回答:

1.メソッド名またはスケルトンのみを提供します(それがインターフェースの唯一の利点ですか)?

--> メソッド名を提供するだけでなく、インターフェイスを実装するクラスが実行できることも定義します。

2.または、MyInterface の使用中にメモリを節約できますか?

-->記憶とは関係ありません

  1. つまり、それを実装するクラスに空のメソッドを提供するだけなので、コード2で行ったように自分で定義しないのはなぜですか. --> インターフェイス駆動型プログラミングの利点をご覧ください。

4.それ以上に、インターフェースを使用する利点があります。--> 特に依存性注入、モッキング、単体テストなど。

于 2013-06-25T10:55:10.210 に答える
1

when-best-to-use-an-interface-in-java で非常に良い説明が見つかります。それは、構築しているものと、スケーラビリティ、コードの重複などをどの程度望んでいるか、または望んでいないかによって異なります。

于 2013-06-25T10:57:21.170 に答える
1

多くのクラスは、インターフェイスを使用して何らかの機能を実行し、他のプログラマーに依存して、インターフェイスが管理するコントラクトを尊重してそのインターフェイスを実装します。そのようなクラスは、たとえば、KeyListeners 、 MouseListenersRunnableなどです。

例: JVM は の処理Thread方法、開始方法、停止方法、操作方法を認識していますが、ユーザーが何をThreadすべきかを認識していないため、インターフェースを実装する必要がありRunnableます。


インターフェイスは、他のクラスで活用できるレベルの抽象化を提供します。たとえば、 というインターフェイスがある場合、の周囲GemetricFigure出力するクラスに、次のようにすべてのGeometryFiguresのリストを反復処理できます。GeometricFigure

public class Canvas {

   private List<GeometricFigure> figures;

   public void print() {
       for (GeometricFigure figure : figure) {
           System.out.println(figure.getGirth());
       }
   }

}

GeometricFigureにそのメソッドしかない場合:

public interface GeometricFigure {

    public Double getGirth();

}

そのインターフェースをどのように実装するSquareかは気にしません。Circleそれ以外の場合、インターフェイスがなければ、 にGeometryFiguresのリストを含めることはできませんがCanvas、すべての Figure タイプのリストを含めることができます。

于 2013-06-25T10:58:36.173 に答える
0

インターフェースは、実装するクラスが満たすべき契約のようなものです。通常、インターフェースを作成し、他のすべてのクラスが独自の実装でそれを実装するようにします。

例:

interface IExporter {
    public void export();
}

public class PDFExport implements IExporter {
    public void export(){
    //code for PDF Exporting
    }
}

public class XLSExport implements IExporter {
    public void export(){
    //code for XLS Exporting
    }
}

public class DOCExport implements IExporter {
    public void export(){
    //code for DOC Exporting
    }
}
于 2013-06-25T10:59:09.373 に答える
0

インターフェイス アプローチを使用すると、次のことができます。

List<MyInterface> list = new ArrayList<MyInterface();

list.add(new User1());
list.add(new User2());

for(MyInterface myInterface : list) {
    myInterface.doClaculation()
}

これは、2 番目のアプローチでは機能しません。インターフェイスは、クラス自体ではなく、クラスを使用するコード用です。

于 2013-06-25T10:59:15.067 に答える
0

多くの場合、インターフェイスを使用できます。また、あなたが説明する状況:どの実装を持っているかを知る必要はありません。

たとえば、コードのどこかにメソッドがあり、それが User1 実装なのか User2 実装なのかわからなくても、現在のサインインされたユーザーを返しますが、どちらもメソッド doCalculation によって何かを計算できます。その状況の本当にダミーの例を追加します。

public void dummyExampleCalculation() {

   getCurrentUser().doCalculation();

}

public MyInterface getCurrentUser() {

   if(...) {
      return new User1();
   } else {
      return new User2();
   }

}
于 2013-06-25T11:00:24.890 に答える
0

それがオブジェクト指向プログラミングのすべてです。Interfaces are used to perform polymorphism. あなたは、両方のクラスの code2 で実装できると言いましたdoCalculation。そのインターフェースを実装してcalculation、独自の形式で書くことができます。

すべてのユーザーに基本的な機能を提供したい場合abstract classes、抽象メソッドdo calculationを宣言し、その基本的な機能の実装を提供して、各ユーザーがdoCalculation独自の方法で拡張できるようにすることができます。

于 2013-06-25T11:03:16.873 に答える