設計モード観後(c++還元リス置換原則)


このデザインモデルを買って、勉強を見てみましょう.以前のノートはgithubの上に置いてあったので、これはcsdnの上に置いておきましょう!毎日更新します!
//里氏置換原則1子類完全親を実現する方法2子類は独自の個性を持つことができる3親を実現する方法を上書きする際に入力パラメータを拡大することができる.
//  、  、    
class AbstractGun
{
public:
	virtual void shoot() {
		cout << "kill people!";
	}
};

class HandGun : public AbstractGun
{
public:
	virtual void shoot() {
		cout << "handgun kill";
	}
};

class Rifle : public AbstractGun
{
public:
	virtual void shoot() {
		cout << "rifle kill";
	}
};

class MachineGun : public AbstractGun
{
public:
	virtual void shoot() {
		cout << "machinegun kill";
	}
};

class Soldier
{
public:
	void SetGun(AbstractGun* _gun) {
		m_gun = _gun;
	}
	
	virtual void KillEnemy() {
		m_gun->shoot();//    ,         。
	}
	virtual ~Soldier() {};
protected:
	AbstractGun* m_gun;
};

//     “   ”   ,       ,    killenemy 。
//                ,
//        ,    、  、         。
class ToyGun
{
public:
	/......./
};

//          
class AUG : public Rifle
{
public:
	void zoomeout() {
		cout << "observed enemy";
	}
	virtual void shoot() {
		cout << "AUG kill";
	}
};

//     ,       ,       (            )
class Snipper : public Soldier
{
public:

	virtual void KillEnemy() {
		AUG* aug = static_cast(m_gun);
		aug->zoomeout();
		aug->shoot();
	}
};

class Client
{
public:
	//    static,             ,      。
	static void Action() {
		Snipper* shibin = new Snipper;
		shibin->SetGun(new AUG);
		shibin->KillEnemy();//    
	}
};