08-多态公有继承
13.3 多态公有继承
RatedPlayer继承示例很简单。派生类对象使用基类的方法,而未做任何修改。然而,可能会遇到这样的情况,即希望同一个方法在派生类和基类中的行为是不同的。换句话来说,方法的行为应取决于调用该方法的对象。这种较复杂的行为称为多态——具有多种形态,即同一个方法的行为随上下文而异。有两种重要的机制可用于实现多态公有继承;
- 在派生类中重新定义基类的方法。
- 使用虚方法。
现在来看另一个例子。由于Webtown俱乐部的工作经历,您成了Pontoon银行的首席程序员。银行要求您完成的第一项工作是开发两个类。一个类用于表示基本支票账户——Brass Account,另一个类用于表示代表Brass Plus支票账户,它添加了透支保护特性。也就是说,如果用户签出一张超出其存款余额的支票——但是超出的数额并不是很大,银行将支付这张支票,对超出的部分收取额外的费用,并追加罚款。可以根据要保存的数据以及允许执行的操作来确定这两种账户的特征。
下面是用于Brass Account支票账户的信息:
- 客户姓名;
- 账号;
- 当前结余。
下面是可以执行的操作:
- 创建账户;
- 存款;
- 取款;
- 显示账户信息。
Pontoon银行希望Brass Plus支票账户包含Brass Account的所有信息及如下信息:
- 透支上限;
- 透支贷款利率;
- 当前的透支总额。
不需要新增操作,但有两种操作的实现不同:
- 对于取款操作,必须考虑透支保护;
- 显示操作必须显示Brass Plus账户的其他信息。
假设将第一个类命名为Brass,第二个类为BrassPlus。应从Brass公有派生出BrassPlus吗?要回答这个问题,必须先回答另一个问题:BrassPlus类是否满足is-a条件?当然满足。对于Brass对象是正确的事情,对于BrassPlus对象也是正确的。它们都将保存客户姓名、账号以及结余。使用这两个类都可以存款、取款和显示账户信息。请注意,is-a关系通常是不可逆的。也就是说,水果不是香蕉;同样,Brass对象不具备BrassPlus对象的所有功能。