2

この質問は、Java/C# のインターフェイスを理解しようとする私の努力で尋ねられます。私のプログラマーの友人が私に言ったように、インターフェイスは理解するのが最も簡単な概念の 1 つですが、効果的に使用するのは非常に困難です。反対票を投じようとしている人は、反対票を投じる前に私を正しい方向に導くことを検討してください(私が求めている知識が得られれば、私は気にしません)。

インターフェースがどのように機能するかは理解していますが、その使用法は私には少し曖昧に思えます。

このことを考慮:

public interface Drawable {
public void draw(Graphics g);
}


public class Line implements Drawable {
public void draw(Graphics g) {
. . . // do something---presumably, draw a line
}
. . . // other methods and variables
}

さて、これで何かをするために、私はまだしなければなりません:

Drawable newObject= new line();

私は Drawable タイプを持っていますが、クラスの新しいオブジェクトである line を作成する必要があります。私が間違っている場合は修正してください。私はまだクラスのオブジェクトを作成しています。上記のコードがメモリの最適化のために行われた場合、上記のコードを書いてもメモリを節約するのに役立ちません(メモリよりも抽象化に関連していることはわかっています)。

私の質問は次のとおりです。クラス行に、実装するインターフェイスで指定されたメソッドがある場合、次のことを実行できないのはなぜですか?

public class Line {
    public void draw(Graphics g) {
    . . . // do something---presumably, draw a line
    }
    . . . // other methods and variables
    }


line newObject= new line();

結局のところ、インターフェイスは基本型を作成する以外に何もしません。私の初心者の理解は次のとおりです。2番目のものはインターフェイスをまったく必要とせず、コードを削減します。

オーバーライドされたメソッドを具象サブクラスに提供する必要があるため、抽象クラスについても同じアプローチを取り、同じことを言うことができます。私の質問は、抽象クラスを必要とせずに具象オブジェクトを宣言して作成しない理由です。

ここで何かが欠けていると確信しています。インターフェイスが便利な理由 私にとっては、実際のクラスによって実際のことが行われるときにコードを追加するだけです。誰か説明してくれませんか?

4

7 に答える 7

8

上記のコードがメモリの最適化のために行われた場合、上記のコードを書いてもメモリを節約するのに役立ちません

優れたプログラミングの実践がパフォーマンスと関係があることはめったにありません。そして、この場合、あなたは正しいです。

結局のところ、インターフェイスは基本型を作成する以外に何もしません。私の初心者の理解は次のとおりです。2番目のものはインターフェイスをまったく必要とせず、コードを削減します。

あなたはあなたの例に合っています。Line 以外の Drawable があるとします。

canvas.draw(new Line());
canvas.draw(new Square());
canvas.draw(new Circle());

また、開発者が独自の形状を追加できるようにしたいと考えています。それらすべてに対して draw メソッドを作成することはできません。あなたが欲しいのは次のようなものです

class Canvas {
    public void draw(Drawable drawable) { /* ... */ }
}

インターフェイスが便利な理由

https://www.google.com/search?q=What+makes+interface+so+usefulは 1 億 3,800 万ヒットを記録しています。

これまで何度も言われたことのないことを、私が何を言うことができるか想像するのは難しい. ;)

于 2013-09-26T12:48:08.420 に答える
3

インターフェイスは、いくつかの (おそらく根本的に異なる) クラスが共通点を持っていることを示すことができ、他の分野での根本的な違いを気にせず、他の分野で類似しているだけである特定のメソッドに渡すことができるアプローチです。

私自身のコードの例;

public interface ToolAffected {

    public void toolUsedOnMe(Tool tool, PickingResult pickingResult,Mob toolUser);
    public void toolUsedOnMe(BlockTool tool, PickingResult pickingResult,Mob toolUser);
    //use polymorphism for more detailed blocks
}

したがって、特定のツールがあれば、ToolAffected を実装するあらゆるものに使用できます。それは、環境、プレイヤー、その他の一部である可能性があります。この場合、私は ToolAffected をグラフィックから選択しました (この質問の範囲をはるかに超えています) が、重要な点は、ToolAffected をグラフィックに接続し、その上でツールを使用するすべてのコードが、少しでも何を気にしないことです。実際には、これら 2 つの方法があるというだけです。

こんな感じで使ってます

        ToolAffected pickingResult=picker.picked(cam.getLocation(),cam.getDirection());
        target.toolUsedOnMe((BlockTool)inventory.getSelectedTool(), pickingResult, this);
于 2013-09-26T12:47:06.673 に答える
1

Javaで

インターフェイスは、多重継承に伴う複雑さから抜け出す方法と考えてください (Java ではサポートされていないため)。それに加えて、多態的な参照としても使用できます。

于 2013-09-26T12:51:09.287 に答える
0

私は、少なくともSOLIDの原則とespプログラムを実装ではなくインターフェースに通すべきだと思います

于 2013-09-26T12:51:27.070 に答える
0

抽象クラスとインターフェースの違い

このリンクにアクセスすると、その違いを確実に理解できます。これは、OOP の概念とその実装を理解するのに最適なサイトです。また、将来的に役立ついくつかの例があります。

于 2013-09-26T12:48:10.860 に答える
0

正方形、円などの幾何学的形状があるとします。それらはすべて、紙に表現することができます。図形の描き方を知っているクラス (アーティスト?) があるとします。あなたは何をしますか?すべての形状のメソッドを作成しますか? 実際には、より多くのコードが必要になります。

代わりに、public void draw(Drawable obj) { obj.draw(); }アーティスト クラス内のようなメソッドを持つことができます。今必要なのは、Square、Circle、およびその他の Shape クラスに Drawable を実装することだけです。

あなたはおそらくこう言うでしょう: Shape クラスに draw を追加すると、Artist は Shape を受け取ります。これは間違っています。私の例が適切に選択されていない可能性がありますが、描画できない形状があると仮定しましょう。したがって、機能は Drawable インターフェイスに入れる必要があります。

于 2013-09-26T12:52:24.617 に答える
0
  1. 複数のインターフェイスを実装できます。ただし、拡張できるクラスは 1 つだけです。
  2. そのより抽象化。Comparable Movable Closable など、オブジェクトで何ができるかを定義します。クラスは同じ階層にある必要はありません
于 2013-09-26T12:52:49.227 に答える