「インターフェースへのプログラム」とは、具体的な型に依存せずに作業を行うことを意味しますが、依存関係を取得する方法を指定しません。
「Dependency Inversion Principle」では、オブジェクトは依存関係の作成を制御するべきではなく、必要な依存関係をアドバタイズし、呼び出し元に提供させます。しかし、依存関係が具象型かインターフェースかを指定しません。
いくつかのC#コードとの違いを説明します。
次の例は具象型に依存し、それ自体の依存関係の作成を制御します。これは、次のいずれも、「依存関係反転」「インターフェイスにプログラムを」:
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor()
{
_myThing = new MyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
次の例はインターフェイスに依存しますが、独自の依存関係の作成を制御します。「インターフェイスへのプログラム」に従いますが、「依存関係の反転」は続きません。
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor()
{
_myThing = ThingFactory.GiveMeANewMyThing();
}
public void DoSomething()
{
_myThing.DoIt();
}
}
次の例は具象型に依存しますが、依存関係を作成してそれに渡すことを要求します。「依存関係の反転」に従いますが、「インターフェースへのプログラム」ではありません。
public class ThingProcessor
{
MyThing _myThing;
public ThingProcessor(MyThing myThing)
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}
次の例はインターフェイスに依存し、依存関係を作成して渡すことを要求します。「依存関係の逆転」と「インターフェースへのプログラム」の両方に従います。
public class ThingProcessor
{
IMyThing _myThing;
public ThingProcessor(IMyThing myThing) // using an interface
{
_myThing = myThing;
}
public void DoSomething()
{
_myThing.DoIt();
}
}