Effective C# 原则20:明辨接口实现和虚函数重载的区别
2009-02-19 08:16:36 来源:WEB开发网粗略的看一下,感觉实现接口和虚函数重载是一样的。你定义了一些对象,但是这些对象是在另一个类型里申明的。你被第一感觉骗了,实现接口与虚函数重载是完全不同的。在接口里定义的成员默认情况下,是根本不存在实际内容的。
派生类不能重载基类中的接口成员。接口可以隐式的实现,就是把它们从类的公共接口中隐藏。它们的概念是不同的而且使用也是不同的。
但你可以这样的实现接口:让你的派生类可以修改你的实现。你只用对派生类做一个Hook就行了。(译注:相信写过C++程序的人就知道hook是什么意思,而且我也实在想不到把hook译成什么比较好,所以就直接用hook这个原词了,就像bug一样。)
为了展示它们的不同之处,试着做一个简单的接口以及在一个类中实现它:
interface IMsg
{
void Message();
}
public class MyClass : IMsg
{
public void Message()
{
Console.WriteLine( "MyClass" );
}
}
Message()方法是MyClass的公共接口,Message同样可以用一个接口指针IMsg来访问。现在让我们来一点繁杂的,添加一个派生类:
public class MyDerivedClass : MyClass
{
public new void Message()
{
Console.WriteLine( "MyDerivedClass" );
}
}
注意到,我添加了一个关键字new在Message方法上,用于区别前面的一个Message(参见原则29)。MyClass.Message()不是虚函数,派生类可以不提供重载版本。MyDerived类创建了一个新的Message方法,但这个方法并不是重载MyClass.Message:它隐藏了原来的方法。而且,MyClass.Message还是可以通过IMsg的引用来访问:
- ››Effective C# 原则40:根据需求选择集合
- ››Effective C# 原则41:选择DataSet而不是自定义的...
- ››Effective C# 原则42:使用特性进行简单的反射
- ››Effective C# 原则43:请勿滥用反射
- ››Effective C# 原则44:创建应用程序特定的异常类
- ››Effective C# 第6章:杂项
- ››Effective C# 原则45:选择强异常来保护程序
- ››Effective C# 原则47:选择安全的代码
- ››Effective C# 原则48:了解更多的工具和资源
- ››Effective C# 原则49:为C#2.0做好准备
- ››Effective C# 原则50:了解ECMA标准
- ››Effective C# 原则系列文章目录
更多精彩
赞助商链接