この質問はかなり遅れて見つかりましたが、私はチャイムを鳴らしたかったのです。
C# のインターフェイスには is-a 関係がありますが、is-an-object ではありません。むしろ、実装です。
つまり、IBar を実装するクラス Foo に対して、次のテストを行います。
Foo myFoo = new Foo();
return myFoo is IBar;
文字通り true を返します。次のようにも言えます。
IBar bar = myArrayList[3] as IBar;
Foo foo = bar as Foo;
または、メソッドが IBar を必要とする場合は、Foo を渡すことができます。
void DoSomething(IBar bar) {
}
static void Main() {
Foo myFoo = new Foo();
DoSomething(myFoo);
}
明らかに、IBar 自体には実装がないため、can-do 関係も適用されます。
interface IBar { void happy(); }
class Foo : IBar
{
void happy()
{
Console.Write("OH MAN I AM SO HAPPY!");
}
}
class Program
{
static void Main()
{
IBar myBar = new Foo();
myBar.happy();
}
}
しかし、それについては、オブジェクトの継承についても同じことが言えます。クラス Bar を継承するクラス Foo のオブジェクトには、インターフェイスと同じように、is-a 関係だけでなく can-do 関係もあります。その実装が事前に構築されているだけです。
本当の問題は、is-a- what、can-do- what ? です。継承されたクラス オブジェクトは[親インスタンス]であり、can-do- [親の動作]であるのに対し、インターフェイスの実装は[インターフェイスの実装]であり、したがって can-do- [インターフェイスの動作]です。
上記のようなプログラムによる is-a 関係が使用されるほとんどの場合、インターフェースのみが評価されるため、継承されたクラスと実装されたインターフェースの両方が同じ is-a と can-do の性質を共有します。
HTH、ジョン