《Head first 设计形式》在C++中应用
《Head first 设计模式》在C++中应用

这个例子是讲,有一个鸭类,各种鸭可能有不同的fly的行为,如果把fly作为鸭的成员函数(接口),继承起来麻烦,有的鸭因为不能飞,还要屏蔽这个接口。
就设计出这么一种,把鸭和飞的行为分开的设计,把飞作为一个interface,其实就是C++里的抽象类(所有成员函数都是纯虚的)。然后某一个特定的鸭,同时继承自鸭和FlyBehavior(C++里叫多重继承,java叫实现接口)。
这个例子里,为了让飞的行为有不同的含义,又继承了两个,一个叫"用翅膀飞",另一个叫"不会飞"。
我不知道这在C++里怎么表示。抽象类又派生出两个抽象类?,两个类的fly还是纯虚函数?
当在 "大黄鸭"这个类里实现 接口的时候,如果用到了鸭的成员变量(如:duckname),不就得重写接口里定义的fly?
------解决方案--------------------
当在 "大黄鸭"这个类里实现 接口的时候
如果只是用到鸭的成员的话,不需要重新定义当在 "大黄鸭"这个类里实现 接口的时候Fly
------解决方案--------------------
为了让飞的行为有不同的含义,又继承了两个,一个叫"用翅膀飞",另一个叫"不会飞"。
首先是存在两个类(也许是抽象的):用翅膀飞 和 不会飞,然后让飞行继承他们,而不是说:“抽象类又派生出两个抽象类?”。
“当在 "大黄鸭"这个类里实现 接口的时候,如果用到了鸭的成员变量(如:duckname),不就得重写接口里定义的fly”这句话无法理解:实现接口----假如她继承了fly的话必须实现它里面的所有函数定义。这和成员变量没有关系吧?
------解决方案--------------------
针对接口编程。
这个例子是讲,有一个鸭类,各种鸭可能有不同的fly的行为,如果把fly作为鸭的成员函数(接口),继承起来麻烦,有的鸭因为不能飞,还要屏蔽这个接口。
就设计出这么一种,把鸭和飞的行为分开的设计,把飞作为一个interface,其实就是C++里的抽象类(所有成员函数都是纯虚的)。然后某一个特定的鸭,同时继承自鸭和FlyBehavior(C++里叫多重继承,java叫实现接口)。
这个例子里,为了让飞的行为有不同的含义,又继承了两个,一个叫"用翅膀飞",另一个叫"不会飞"。
我不知道这在C++里怎么表示。抽象类又派生出两个抽象类?,两个类的fly还是纯虚函数?
当在 "大黄鸭"这个类里实现 接口的时候,如果用到了鸭的成员变量(如:duckname),不就得重写接口里定义的fly?
------解决方案--------------------
当在 "大黄鸭"这个类里实现 接口的时候
如果只是用到鸭的成员的话,不需要重新定义当在 "大黄鸭"这个类里实现 接口的时候Fly
------解决方案--------------------
为了让飞的行为有不同的含义,又继承了两个,一个叫"用翅膀飞",另一个叫"不会飞"。
首先是存在两个类(也许是抽象的):用翅膀飞 和 不会飞,然后让飞行继承他们,而不是说:“抽象类又派生出两个抽象类?”。
“当在 "大黄鸭"这个类里实现 接口的时候,如果用到了鸭的成员变量(如:duckname),不就得重写接口里定义的fly”这句话无法理解:实现接口----假如她继承了fly的话必须实现它里面的所有函数定义。这和成员变量没有关系吧?
------解决方案--------------------
针对接口编程。
#include <stdio.h>
#include <vector>
class Flyable
{
public:
virtual void fly()= 0;
virtual ~Flyable(){}
};
class FlyWithSwings : public Flyable
{
public:
void fly()
{
puts("I believe I can fly");
}
protected:
//因为FlyWithSwings的实例没有意义,这个类是为了被继承的
~FlyWithSwings(){};
};
class FlyNoWay : public Flyable
{
public:
void fly()
{
puts("I wish I could, but I can't");
}
protected:
//因为FlyWithSwings的实例没有意义,这个类是为了被继承的
~FlyNoWay(){};
};
class Eagle : public FlyWithSwings
{};
class Duck : public FlyNoWay
{};
//针对接口编程
void goFly(std::vector<Flyable*> const& fv)
{
for(auto f: fv)
{
f->fly();
}
}
int main (void)
{
Eagle e;
Duck d;
std::vector<Flyable*> fv(2);
fv[0] = &e, fv[1] = &d;
goFly(fv);
return 0;