我在精确地制定问题上遇到了问题,因此在标题中保留了更一般的描述(如果您对问题有更精确的描述,请发表评论,我将对其进行标题编辑)。

问题:两个类AudioStreamVideoStream从基类MediaStream派生,该基类在音频和视频流方法中具有一些共同点,但不能按原样使用。因此,有两个类AudioStreamSettingsVideoStreamSettingsMediaStreamSettings派生并传递到其相应流类的构造函数。 MediaStreamSettings存储音频和视频通用的设置,并且基类MediaStream访问此数据。问题是:在流和设置的基类之间设计这种层次关系的最佳方法是什么?

我可以想到一个如下的快速解决方案:

class MediaStream {
public:
  MediaStream(const MediaStreamSettings& settings){
    // do nothing, let derived classes initialize settings_
    // note: I feel guilty for doing this...
  }
  virtual ~MediaStream(){}
protected:
  std::shared_ptr<MediaStreamSettings> settings_;
};

class VideoStream : public MediaStream {
public:
  VideoStream(const VideoStreamSettings& settings):
    MediaStream(settings)
  {
    settings_ = std::make_shared<VideoStreamSettings>(settings);
  }

  void doSomething(){
    int s1 = std::dynamic_pointer_cast<VideoStream, MediaStream>(settings_)->getVideoStreamSetting1();
    ...
  }
};

class AudioStream : public MediaStream {
public:
  AudioStream(const AudioStreamSettings& settings):
    MediaStream(settings)
  {
    settings_ = std::make_shared<AudioStreamSettings>(settings);
  }
}


总而言之,我对这种方法的两点不满意:


不在基类中初始化settings_(我应该抽象为使自己平静下来吗?)
每次需要访问派生类中的设置时,都使用dynamic_pointer_cast(我应该为此做一个方法包装吗?)

最佳答案

一种解决方案是不将数据存储在MediaStream中并添加虚拟方法

virtual const MediaStreamSettings& GetMediaStreamSettings() const = 0;

关于c++ - 设计模式:继承和封装继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36510946/

10-12 05:07