我在精确地制定问题上遇到了问题,因此在标题中保留了更一般的描述(如果您对问题有更精确的描述,请发表评论,我将对其进行标题编辑)。
问题:两个类AudioStream
和VideoStream
从基类MediaStream
派生,该基类在音频和视频流方法中具有一些共同点,但不能按原样使用。因此,有两个类AudioStreamSettings
和VideoStreamSettings
从MediaStreamSettings
派生并传递到其相应流类的构造函数。 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/