简体中文版翻译:申旻,nicrosoft@sunistudio.com
接口是公司最有价值的资源。设计接口比用一堆类来实现这个接口更费时间。而且接口需要更昂贵的人力的时间。
既然接口如此有价值,它们应该被保护,以免因为数据结构和其他实现的改变而被破坏。因此,应该将接口和实现分离。
[ Top | Bottom | Previous section | Next section ]
使用ABC。(译注:即抽象基类 abstract base class)
[ Top | Bottom | Previous section | Next section ]
抽象基类(abstract base class)。
在设计层次,抽象基类(ABC)对应于抽象概念。如果你问一个机修工他是否修理交通工具,他可能想知道你所说的是哪种交通工具。他不修理航天飞机、远洋轮、自行车或核潜艇。问题在于“交通工具”是一个抽象概念(例如,除非你知道你要建造哪种交通工具,否则你无法建造一个“交通工具”)。在C++中,Vehicle(交通工具)类是一个ABC,而Bicycle(自行车),SpaceShuttle(航天飞机)等则是派生类(OceanLiner(远洋轮)是一种Vehicle)。在真实世界的OO中,ABC无处不在。
在程序语言层次上,抽象基类(ABC)是有一个或多个纯虚成员函数的类。无法建立抽象基类的对象(实例)。
[ Top | Bottom | Previous section | Next section ]
将普通类变成抽象基类(也就是ABC)的成员函数。通常只在派生类中实现它。
某些成员函数只在概念中存在,而没有合理的定义。例如,假设我让你在坐标(x,y)处画一个图形,大小为 7。你会问我:“我应该画哪种图形?”(圆,矩形,六边形等,画法都不同)。在C++中,我们必须指出 draw() 成员函数的实在物(由此用户才能在有一个Shape*或者 Shape& 的时候调用它),但我们认识到,在逻辑上,它只能在子类中被定义:
这个纯虚函数使 Shape 成为了ABC(抽象基类)。如果你愿意,你可以将“= 0;”语法看作为代码位于NULL指针处。因此 Shape 向它的用户承诺了一个服务,然而 Shape 无法提供任何代码来实现这个承诺。这样做使得即使基类没有足够的信息来实际定义成员函数时,也强制了任何由 Shape 派生的具体类的对象须给出成员函数。
注意,为纯虚函数提供一个实现是可能的,但是这样通常会使初学者糊涂,并且最好避免这样,直到熟练之后。
[ Top | Bottom | Previous section | Next section ]
如果类拥有被(抽象)基类指针指向的对象,则在(抽象)基类中使用虚构造函数用法。就如同一般用法一样,在基类中声明一个纯虚方法 clone() :
然后在每个派生类中实现 clone()方法:
现在假设每个 Fred 对象有一个 Shape对象。Fred对象自然不知道 Shape是圆还是矩形还是……。Fred的拷贝构造函数和赋值操作符将调用Shape的clone()方法来拷贝对象:
[ Top | Bottom | Previous section | Next section ]
E-mail the author
[ C++ FAQ Lite
| Table of contents
| Subject index
| About the author
| ©
| Download your own copy ]
Revised Apr 8, 2001