我有一个Recorder
课程。它可以录制场景,音频和音乐。录制过程的精确细节并不重要 - 例如,场景录制需要几个实例变量,API看起来像这样:
- (void) startRecordingScene: (Scene*) scene;
- (void) stopRecordingCurrentScene;
音频和音乐也是如此。我不喜欢的课程是它真的有三个类 - 一个用于录制场景,一个用于音频,一个用于音乐。我想分开课程,但我不确定如何。这是Objective-C,因此我可以使用类别,但那些不能添加新的实例变量。
您如何看待使用继承分层功能?与SceneRecorder
,AudioRecorder
和MusicRecorder
一样,每个都继承自前一个。这感觉就像滥用继承一样。这三者是相关的,但我不能说AudioRecorder
是SceneRecorder
。我可以称他们为AudioRecorder
,AudioAndSceneRecorder
等,但那太乱了。
组成怎么样?所有三个组件都需要共享一些数据,例如录制本身或有关上次录制事件的信息。所以构图似乎也不合适。
你会怎么做这样的设计?
答案 0 :(得分:1)
音乐显然是音频的一个子集,因此MusicRecorder可以是AudioRecorder的子类。一个场景可能是视频和音频? Obj-C中没有多重继承,但我猜一个场景不是单独的音频和视频,所以两者都应该是Recorder的子类。
你可以摆脱整个混乱,只暴露Recorder,它是类集群的可见部分。组成群集的各个类保持私有。这样你就可以随意结合。只需确保您的Recorder类暴露所有可能性:
-(id) initWithMusic:(Music *)music; // returns MusicRecorder
-(id) initWithScene:(Scene *)scene; // returns SceneRecorder
等。在内部,您的设计可以在有意义的地方使用层次结构,而在外部,只有一个类。两个世界中最好的,IMO。