拜读大牛秦小波所著的《设计模式之禅》,从中学习到的做一个记录,其中所涉及的思想,定义等版权属于秦小波先生,个人纯属学习!

一、里氏替换原则定义:Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.(所有引用基类的地方必须能透明地使用其子类对象)。

 二、类图

《设计模式之禅》---里氏替换原则

三、代码

LSP.h

#pragma once

//父类
class AbstaractGun
{
public:
AbstaractGun();
~AbstaractGun();

virtual void shoot();
private:

};

//子类 手枪
class HandGun:public AbstaractGun
{
public:
HandGun();
~HandGun();
void shoot();
private:

};

//子类 步枪
class Rifle:public AbstaractGun
{
public:
Rifle();
~Rifle();
void shoot();
private:

};

//子类AUG狙击枪
class AUG:public Rifle
{
public:
AUG();
~AUG();

void zoomOut();
void shoot();
private:
};

//子类 机枪
class MachineGun:public AbstaractGun
{
public:
MachineGun();
~MachineGun();
void shoot();
private:

};

//士兵实现类
class Soldier{
public:
Soldier();
~Soldier();
void setGun(AbstaractGun *_gun);
void killEnemy();
private:
AbstaractGun *gun;
};

//狙击手
class Snipper
{
public:
Snipper();
~Snipper();
void killEnemy(AUG *aug);
private:
};

LSP.cpp

// LSP.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "LSP.h"
#include <iostream>
using std::string;
using std::cout;
using std::endl;
//父类
AbstaractGun::AbstaractGun()
{

}

AbstaractGun::~AbstaractGun()
{

}

void AbstaractGun::shoot()
{
//cout<<"开始射击啦!" <<endl;
}

//子类 手枪
HandGun::HandGun()
{

}

HandGun::~HandGun()
{

}

void HandGun::shoot()
{
cout<<"手枪射击"<<endl;
}

//子类 步枪
Rifle::Rifle()
{

}
Rifle::~Rifle()
{

}
void Rifle::shoot()
{
cout<<"步枪射击"<<endl;
}

AUG::AUG()
{

}
AUG::~AUG()
{

}
void AUG::zoomOut()
{
cout<<"通过望远镜观察敌人..."<<endl;
}

void AUG::shoot()
{
cout<<"AUG射击"<<endl;
}

//子类 机枪
MachineGun::MachineGun()
{

}
MachineGun::~MachineGun()
{

}
void MachineGun::shoot()
{
cout<<"机枪扫射"<<endl;
}

//士兵实现类
Soldier::Soldier()
{

}
Soldier::~Soldier()
{

}
void Soldier::setGun(AbstaractGun *_gun)
{
this->gun = _gun;
}

void Soldier::killEnemy()
{
cout<<"士兵开始杀敌人"<<endl;
gun->shoot();
}

Snipper::Snipper()
{

}

Snipper::~Snipper()
{

}

void Snipper::killEnemy(AUG *aug)
{
aug->zoomOut();

aug->shoot();
}
int _tmain(int argc, _TCHAR* argv[])
{
Soldier *sanMao = new Soldier();

//sanMao->setGun(new Rifle());

//直接将工具类型传入
sanMao->setGun(new MachineGun());
sanMao->killEnemy();

Snipper *erDan = new Snipper();
//erDan->setGun(new AUG());
erDan->killEnemy(new AUG());
return 0;
}

运行结果:

士兵开始杀敌人
机枪扫射
通过望远镜观察敌人...
AUG射击
请按任意键继续. . .

 

相关文章:

  • 2021-04-05
  • 2021-06-05
  • 2021-12-29
  • 2021-07-17
  • 2022-01-23
猜你喜欢
  • 2021-12-05
  • 2021-06-10
  • 2022-01-04
  • 2021-09-02
  • 2021-08-14
相关资源
相似解决方案