案例描述:
制作饮品的大致流程为:煮水-冲泡-倒入杯中-加入辅料
利用多态技术实现本案例,提供抽象类制作饮品基类,提供子类制作咖啡和茶叶。
按照我们之前的总结:
多个类:可以抽象出共同的父类, 父类中写所有对象共有的方法,但是不知道如何写父类中这个方法。
此时抽象类中包含纯虚函数即可:类名:AbstractDrinking。两者都有的过程或者说操作,可以抽象为方法,这些方法名可以叫:煮水、冲泡、倒入杯中、加调料。不同的饮品,这四个操作不同。因此写四个纯虚函数。
//抽象制作饮品
class AbstractDrinking {
public:
//烧水
virtual void Boil() = 0;
//冲泡
virtual void Brew() = 0;
//倒入杯中
virtual void PourInCup() = 0;
//加入辅料
virtual void PutSomething() = 0;
//规定流程
void MakeDrink() {
Boil();
Brew();
PourInCup();
PutSomething();
}
};
最后要把这四个纯虚函数代表的动作,流程化,统一执行,这个我们指导怎么写,因此,最后我们写一个普通的成员函数MakeDrink()。
写子类:
//制作咖啡
class Coffee : public AbstractDrinking {
public:
//烧水
virtual void Boil() {
cout << "煮农夫山泉!" << endl;
}
//冲泡
virtual void Brew() {
cout << "冲泡咖啡!" << endl;
}
//倒入杯中
virtual void PourInCup() {
cout << "将咖啡倒入杯中!" << endl;
}
//加入辅料
virtual void PutSomething() {
cout << "加入牛奶!" << endl;
}
};
//制作茶水
class Tea : public AbstractDrinking {
public:
//烧水
virtual void Boil() {
cout << "煮自来水!" << endl;
}
//冲泡
virtual void Brew() {
cout << "冲泡茶叶!" << endl;
}
//倒入杯中
virtual void PourInCup() {
cout << "将茶水倒入杯中!" << endl;
}
//加入辅料
virtual void PutSomething() {
cout << "加入枸杞!" << endl;
}
};
调用执行:业务函数
//业务函数
void DoWork(AbstractDrinking* drink) {
drink->MakeDrink();
delete drink;
}
void test01() {
DoWork(new Coffee);
cout << "--------------" << endl;
DoWork(new Tea);
}
动态多态关键:本质:形参传入:
AbstractDrink* drink = new Coffee;
AbstractDrink* drink = new Tea;
如果想制作其他饮品,那么只要继续增加一个新类就可以。然后业务修改一下即可,无需修改类和整体设计。
我们应该封装一些固定,不变的,稳定的、确定的成员;把不确定的,有可能改变的成员抽象为抽象成员、抽象类,留给子类去实现。