静观其变

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

[R]深入剖析C# 的接口编程(七)

七、覆盖虚接口


有时候我们需要表达一种抽象的东西,它是一些东西的概括,但我们又不能真正的看到它成为一个实体在我们眼前出现,为此面向对象的编程语言便有了抽象类的概念。C#作为一个面向对象的语言,必然也会引入抽象类这一概念。接口和抽象类使您可以创建组件交互的定义。通过接口,可以指定组件必须实现的方法,但不实际指定如何实现方法。抽象类使您可以创建行为的定义,同时提供用于继承类的一些公共实现。对于在组件中实现多态行为,接口和抽象类都是很有用的工具。


一个抽象类必须为类的基本类列表中列出的接口的所有成员提供实现程序。但是,一个抽象类被允许把接口方法映射到抽象方法中。例如

interface IMethods {
void F();
void G();
}

abstract class C: IMethods
{
public abstract void F();
public abstract void G();
}

这里, IMethods 的实现函数把F和G映射到抽象方法中,它们必须在从C派生的非抽象类中被覆盖。


注意显式接口成员实现函数不能是抽象的,但是显式接口成员实现函数当然可以调用抽象方法。例如

interface IMethods
{
void F();
void G();
}

abstract class C: IMethods
{
void IMethods.F() { FF(); }
void IMethods.G() { GG(); }
protected abstract void FF();
protected abstract void GG();
}

这里,从C派生的非抽象类要覆盖FF 和 GG, 因此提供了IMethods的实际实现程序。


八、总结


组件化程序设计方法继承并发展了面向对象的程序设计方法。它把对象技术应用于系统设计,对面向对象的程序设计的实现过程作了进一步的抽象。我们可以把组件化程序设计方法用作构造系统的体系结构层次的方法,并且可以使用面向对象的方法很方便地实现组件。


接口是组件之间的协议,描述了组件对外提供的服务。从技术上讲接口是一组包含了函数型方法的数据结构。通过这组数据结构,客户代码可以调用组件对象的功能。接口可以从父接口中继承。接口的继承首先是说明性继承,不是实现性继承,它的实现需要通过类或结构来实现;其次接口继承可以是多继承。


接口包含的成员有方法、属性、索引指示器和事件。由于接口允许多继承,在可能发生二义性的地方可以采用全权名来避免。

可以用类来实现接口。在类中定位接口成员的实现称之为接口映射。类必须为接口的所有成员提供具体的实现,包括接口中显式定义的成员,以及接口从父接口中继承而来的成员。同样,在对接口的实现过程中可以采用显式接口成员执行体来避免产生二义性。

派生类可以对基类已经实现的接口进行重实现。


抽象类也可以实现接口,但接口成员必须映射到抽象类的抽象成员。抽象类的派生类如果是非抽象类,则必须通过方法重载来实现接口成员。

(全文完)

posted on 2005-03-24 15:18  wangyue  阅读(343)  评论(0)    收藏  举报