发现这个问题很晚,但我想插话。
C# 中的接口具有 is-a 关系,但没有 is-an-object。相反,is-an-implementation。
换句话说,对于实现 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 本身没有实现,所以可以做的关系也适用。
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 的对象具有 can-do 关系以及 is-a 关系,与接口相同。只是它的实现是为它预先构建的。
真正的问题是,是什么,能做什么?继承的类对象是-a- [父实例]和 can-do- [父行为],而接口的实现是-an- [接口实现]因此 can-do- [接口行为]。
在大多数使用程序化 is-a 关系(例如上面列出的那些)的情况下,只评估接口,因此继承的类和实现的接口共享相同的 is-a 和 can-do 质量。
HTH,乔恩