【说明】 某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如表10-6所示: 表10-6
为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如图10-11所示:
其中,Duck为抽象类,描述了抽象的鸭子,而类RubberDuck、MallardDuck、 CottonDuck和RedHeadDuck分别描述具体的鸭子种类,方法fly()、quack()和display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;类FlyBehavior与 QuackBehavior为抽象类,分别用于表示抽象的飞行行为与发声行为:类FlyNoWay与 FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、Squeak与 QuackNoWay分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。【C++代码】 #include<iostream> using namespace (1) ; class FlyBehavior{ public: (2) fly()=0; }; class QuackBehavior{ public: (3) quack() = 0; }; class FlyWithWings:public FlyBehavior{ public:void fly(){ cout<< “使用翅膀飞行 ! ” <<endl; } }; class FlyNoWay:public FlyBehavior{ public:void fly(){ cout<< “不能飞行!”<<endl;} }; class Quack:public QuackBehavior{ public:void quack(){ cout<<“发出\‘嘎嘎\’声 !”<<endl; } }; class Squeak:public QuackBehavior{ public:void quack(){cout<<“发出空气与橡皮摩擦声!”<<endl; } }; class QuackNoWay:public QuackBehavior{ public:void quack (){ cout<<“不能发声 !”<<endl; } }; class Duck{ protected: FlyBehavior* (4) ; QuackBehavior* (5) ; public: void fly(){ (6) ; } void quack(){ (7) ;); virtual void display()=0; }; class RubberDuck:public Duck{ public: RubberDuck(){ flyBehavior=new (8) ; quackBehavior=new (9) ; } ~RubberDuck(){ if(!flyBehavior)delete flyBehavior; if(!quackBehavior) delete quackBehavior; } void display(){/*此处省略显示橡皮鸭的代码*/ } }; //其他代码省略
参考答案:
解析:(1) std (2) virtual void (3) virtual void (4) fiyBehavior (5) quackBehavior (6) flyBehavior->fly() (7) quackBehavior->quack() (8) FlyNoWay() (9) Squeak()
[分析]: C++标准的输出输入的命名空间为std,在本题的代码中使用了cout,因此必须使用标准的命名空间,空(1)处应该填写std;FlyWithWings和FlyNoWay类继承了 FlyBehavior,根据它们的成员函数fly的定义可知,fly函数的返回值为void,又因为 FlyBehavior中函数为纯虚拟函数,因此,空(2)处应该填写virtual void,空(3)处的原理和空(2)相同;Duck是各种鸭子种类的基类,而每一种鸭子都具有飞行特征和发声特征,这两种特征分别通过FlyBehavior 和 QuackBehavior来实现,因此空(4)和(5)处应该为这两个类的对象或者指针(这两个类为纯虚类,因此只能采用指针形式)。每一种具体的鸭子种类的飞行特征和发声特征是不同的,因此,在每一种具体鸭子类的构造函数中需要指定其具有的飞行特征和发声特征,表10-6已经指出了RubberDuck的这两种特征分别为FlyNoWay 和 Squeak,所以,通过构造相应类的对象来实现该特征。