2、C++设计模式及实际应用-继承
程序员文章站
2024-01-20 19:49:34
...
关于继承和多态,它是面向对象设计思想的核心所在。它们的语法细节,很多书籍和教程上都有详细的讲解,这里就不再赘述了,本节将重点讲解继承和多态的设计思想和实际应用场景。
例如我们在开发一款手机游戏里面的弹窗界面,有用户弹窗、好友弹窗、展示弹窗、设置弹窗、提示弹窗、警告弹窗,功能如下:
- 用户弹窗:弹入弹出动画、中型尺寸、用户信息
- 好友弹窗:弹入弹出动画、中型尺寸、好友信息
- 展示弹窗:弹入弹出动画、大型尺寸、展示内容
- 设置弹窗:弹入弹出动画、大型尺寸、设置选项
- 提示弹窗:弹入弹出动画、小型尺寸、提示信息
- 警告弹窗:弹入弹出动画、小型尺寸、警告信息
实际项目中的功能会更多更复杂
当我们不考虑继承时候,代码实现是这样子的
class UserDailog {
public:
void show(); // 展示弹窗
void hide(); // 隐藏弹窗
void setUserInfo(UserInfo& info); // 设置用户信息
private:
DailogSize size = DailogSize::MEDIUM; // 中型弹窗尺寸
};
class FriendDailog {
public:
void show();
void hide();
void setFriendInfo(FriendInfo& info);
private:
DailogSize size = DailogSize::MEDIUM;
};
class DisplayDailog {
public:
void show();
void hide();
void setDisplayInfo(DisplayInfo& info);
private:
DailogSize size = DailogSize::LARGE; // 大型弹窗尺寸
};
class SettingDailog {
public:
void show();
void hide();
void setSettingInfo(SettingInfo& info);
private:
DailogSize size = DailogSize::LARGE;
};
class TipsDailog {
public:
void show();
void hide();
void setTipsInfo(TipsInfo& info);
private:
DailogSize size = DailogSize::SMALL; // 小型弹窗尺寸
};
class WarningDailog {
public:
void show();
void hide();
void setWarningInfo(WarningInfo& info);
private:
DailogSize size = DailogSize::SMALL;
};
从上面的代码可以看出,每一个类都有一个重复的show、hide方法,并且size属性的值总共也只有三种。我们该如何提高代码的复用率,不再去重复的拷贝粘贴show、hide方法以及size属性呢?
继承将会是一个非常有效的解决办法,我们可以将show和hide封装成一个一级基础类BaseDailog,然后将size封装成三个二级基础类SmallDailog、MediumDailog和LargeDailog,它们都继承于BaseDailog类。
基础类的代码实现
// 一级基础类
class BaseDailog {
public:
void show();
void hide();
};
// 二级基础类
class SmallDailog : public BaseDailog {
private:
DailogSize media = DailogSize::SMALL;
};
class MeduimDailog : public BaseDailog {
private:
DailogSize media = DailogSize::MEDIUM;
};
class LargeDailog : public BaseDailog {
private:
DailogSize media = DailogSize::LARGE;
};
功能弹窗类的代码实现
class UserDailog : public MeduimDailog {
public:
void setUserInfo(UserInfo& info);
};
class FriendDailog : public MeduimDailog {
public:
void setFriendInfo(FriendInfo& info);
};
class DisplayDailog : public LargeDailog {
public:
void setDisplayInfo(DisplayInfo& info);
};
class SettingDailog : public LargeDailog {
public:
void setSettingInfo(SettingInfo& info);
};
class TipsDailog : public SmallDailog {
public:
void setTipsInfo(TipsInfo& info);
};
class WarningDailog : public SmallDailog {
public:
void setWarningInfo(WarningInfo& info);
};
相比于之前不使用继承的代码,使用继承的代码更加精简,同时也方便扩展,假如后续需要新增一个签到弹窗,我们只需要增加一个setSignatureInfo方法即可
SignatureDailog : public MeduimDailog {
public:
void setSignatureInfo(SignatureInfo& info);
};
上一篇: Rtthread学习笔记(五)串口设备使用示例--DMA 接收及轮询发送
下一篇: js小结
推荐阅读