C++设计模式
上QQ阅读APP看书,第一时间看更新

2.2.4 企鹅不是鹅中的里氏替换原则

2.2.3小节对计算不同动物跑100米所用时间的实际问题及求解步骤进行了详细说明,UML类图展现了详细的程序设计清单,根据这个程序设计清单可以轻松地实现解决“企鹅不是鹅”问题的代码框架,并且为今后的扩展留足余量。下面就是利用里氏替换原则解决实际问题的程序设计框架。

第一步:设计里氏替换原则的核心——抽象基类Animal。

#pragma once
#include <iostream>
 
using namespace std;
 
class Animal
{
    public:
     //输出用时
        void  printTime()
        {
            cout<<"Which animal? used time: ";
        }
        virtual int setFlySpeed(double speed) = 0;
 
};

第二步:新增抽象基类分别对应派生类Goose和Penguin,实现基类的虚方法。

#include "animal.h"
 
class Goose:public Animal
{
    public:
       int setFlySpeed(double speed)
       {
          return  speed;
       }
};
 
class Penguin:public Animal
{
    public:
       int setFlySpeed(double speed)
       {
           return speed;
       }
};

第三步:设计程序框架的入口类calTime,客户端通过这个入口控制软件流程。

#include "goose.h"
#include "penguin.h"
#include <csignal>
#include <cmath>
 
#define dis 100
 
class calTime
{
    public:
        void showcalTime(Animal* an, double sp)
        {   
            an->printTime();
            cout<< dis / an->setFlySpeed(sp) <<endl;
        }
 
};

第四步:客户端调用实现企鹅不是鹅中的里氏替换原则。

int main()
{
    //基类指针指向派生类的对象
    Animal *goose = new Goose();
    Animal *penguin = new Penguin();
    
    calTime *time = new calTime();
    //派生类可以替代基类,根据传参对象和数值进行时间计算
    time->showcalTime(goose,20);
    time->showcalTime(penguin,2);
    delete goose;
    delete penguin;
    delete time;
    
    return 0;
 
}

结果显示:

Which animal? used time: 5
Which animal? used time: 50