-1

重複の可能性:
なぜインターフェイスを使用する必要があるのですか? インターフェイスが必要な理由

どこでいつ使用するのか知りたいですか?

例えば、

interface IDemo
{
 // Function prototype
 public void Show();
}

// First class using the interface
class MyClass1 : IDemo
{
 public void show()
 {
  // Function body comes here
  Response.Write("I'm in MyClass");
 } 
}

// Second class using the interface
class MyClass2 : IDemo
{
 public void show() 
 {
  // Function body comes here
  Response.Write("I'm in MyClass2");
  Response.Write("So, what?");
 }

これら 2 つのクラスは、本体が異なる同じ関数名を持ちます。これは、インターフェイスがなくても実現できます。では、なぜいつどこでそれを使用するためにインターフェイスが必要なのでしょうか?

4

3 に答える 3

1

show()単純なケースでは、実装する(またはおそらくそれを抽象として定義する)共通の基本クラスを使用して、インターフェイスで得られるものと同様のものを実現できます。一般名をMyClass1MyClass2ではなく、 EagleHawkというより具体的な名前に変更させてください。その場合、次のようなコードを書くことができます

Bird bird = GetMeAnInstanceOfABird(someCriteriaForSelectingASpecificKindOfBird);
bird.Fly(Direction.South, Speed.CruisingSpeed);

これにより、 *Bird*であるすべてのものを処理できるコードを記述できます。次に、 Birdとして処理するインスタンスに作用すること (飛ぶ、食べる、卵を産むなど) をBirdに実行させるコードを記述できます。このコードは、 Birdが実際にEagleであるか、Hawkであるか、またはBirdから派生したものであるかに関係なく機能します。

ただし、真の関係がない場合、そのパラダイムは乱雑になり始めます。空を飛び回るコードを書きたいとします。Bird基本クラスを受け入れるようにそのコードを作成すると、そのコードをJumboJetインスタンスで動作するように進化させることが突然難しくなります。なぜなら、BirdJumboJetは確かに両方とも飛ぶことができますが、JumboJetは間違いなくBirdではないからです。

インターフェイスに入ります。

Bird (とEagleHawk )の共通点は、すべて空を飛べることですインターフェイスIFlyで動作する代わりに上記のコードを記述した場合、そのコードは、そのインターフェイスに実装を提供するすべてのものに適用できます。

于 2012-08-05T06:25:05.293 に答える
0

ここにいくつかの良いリンクがあります。

http://www.daniweb.com/software-development/csharp/threads/114364/why-use-interfaces

http://fci-h.blogspot.com/2008/03/oop-design-concepts-interfaces_05.html

詳細: 基本的に、それらはより抽象化を提供します。あなたがオブジェクトを言うならAlien、この場合、すべてのエイリアンは宇宙から来ています. すべてのエイリアンがまったく同じというわけではありませんが、すべてのエイリアンが食物を消費し、エネルギーを消費します。それらが食物を消費し、エネルギーを使用する方法は異なるかもしれませんが、基本Alienクラスを保持し、そのクラスから抽象化されたインターフェイスを持つ方が、型ごとに個別のクラスを持つよりも理にかなっています。

コア ロジックは基本クラスで同じに保つことができ、インターフェイスは必要に応じてパーツを変更できます。

于 2012-08-05T06:19:42.350 に答える
0

相互に依存するコンポーネントがある場合、ほとんどの場合、インターフェイスが必要になります。一般的な例は、ロギング コントローラーといくつかのロガー クラスです。

class LoggingController {

    private ILogger _logger

    // expecting an interface here removes the dependency 
    // to a specific implemenentation.
    // all it cares about is that the object has a Log() method
    public LoggingController(ILogger logger) {
        _logger = logger;
    }

    public void Log() { _logger.Log(); }
}

interface ILogger { 
    void Log(); 
}

class DbLogger : ILogger { 
    public void Log(){ //log into db }
}

class TxtLogger : ILogger {
    public void Log(){ //log into a txt file }
}

実行時に、ロギング コントローラーは ILogger の任意の実装を挿入できますが、ロガーが実際にログを記録するために実際に何を行うかはまったく認識されません。

インターフェイスへのプログラミングのもう 1 つの利点は、単体テストが容易になることです。コントローラーは、インターフェースも実装するモックロガーを注入することで簡単に単体テストできます。

于 2012-08-05T06:27:21.187 に答える