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

Jenf_Mu 2013-08-11 09:25:01


这个例子是讲,有一个鸭类,各种鸭可能有不同的fly的行为,如果把fly作为鸭的成员函数(接口),继承起来麻烦,有的鸭因为不能飞,还要屏蔽这个接口。
就设计出这么一种,把鸭和飞的行为分开的设计,把飞作为一个interface,其实就是C++里的抽象类(所有成员函数都是纯虚的)。然后某一个特定的鸭,同时继承自鸭和FlyBehavior(C++里叫多重继承,java叫实现接口)。

这个例子里,为了让飞的行为有不同的含义,又继承了两个,一个叫"用翅膀飞",另一个叫"不会飞"。
我不知道这在C++里怎么表示。抽象类又派生出两个抽象类?,两个类的fly还是纯虚函数?
当在 "大黄鸭"这个类里实现 接口的时候,如果用到了鸭的成员变量(如:duckname),不就得重写接口里定义的fly?
...全文
194 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
vuqrzk5w 2013-08-13
  • 打赏
  • 举报
回复
楼主看书看一半啊,人家书里后面讲了,实际的类不是继承自接口,是把接口作为两个成员变量的
mujiok2003 2013-08-11
  • 打赏
  • 举报
回复
针对接口编程。

#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;
}
忘世麒麟 2013-08-11
  • 打赏
  • 举报
回复
为了让飞的行为有不同的含义,又继承了两个,一个叫"用翅膀飞",另一个叫"不会飞"。 首先是存在两个类(也许是抽象的):用翅膀飞 和 不会飞,然后让飞行继承他们,而不是说:“抽象类又派生出两个抽象类?”。 “当在 "大黄鸭"这个类里实现 接口的时候,如果用到了鸭的成员变量(如:duckname),不就得重写接口里定义的fly”这句话无法理解:实现接口----假如她继承了fly的话必须实现它里面的所有函数定义。这和成员变量没有关系吧?
max_min_ 2013-08-11
  • 打赏
  • 举报
回复
当在 "大黄鸭"这个类里实现 接口的时候 如果只是用到鸭的成员的话,不需要重新定义当在 "大黄鸭"这个类里实现 接口的时候Fly

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧