欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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);
};