使用继承分层功能?

时间:2011-08-02 06:53:11

标签: objective-c oop

我有一个Recorder课程。它可以录制场景,音频和音乐。录制过程的精确细节并不重要 - 例如,场景录制需要几个实例变量,API看起来像这样:

- (void) startRecordingScene: (Scene*) scene;
- (void) stopRecordingCurrentScene;

音频和音乐也是如此。我不喜欢的课程是它真的有三个类 - 一个用于录制场景,一个用于音频,一个用于音乐。我想分开课程,但我不确定如何。这是Objective-C,因此我可以使用类别,但那些不能添加新的实例变量。

您如何看待使用继承分层功能?与SceneRecorderAudioRecorderMusicRecorder一样,每个都继承自前一个。这感觉就像滥用继承一样。这三者是相关的,但我不能说AudioRecorderSceneRecorder。我可以称他们为AudioRecorderAudioAndSceneRecorder等,但那太乱了。

组成怎么样?所有三个组件都需要共享一些数据,例如录制本身或有关上次录制事件的信息。所以构图似乎也不合适。

你会怎么做这样的设计?

1 个答案:

答案 0 :(得分:1)

音乐显然是音频的一个子集,因此MusicRecorder可以是AudioRecorder的子类。一个场景可能是视频和音频? Obj-C中没有多重继承,但我猜一个场景不是单独的音频和视频,所以两者都应该是Recorder的子类。

你可以摆脱整个混乱,只暴露Recorder,它是类集群的可见部分。组成群集的各个类保持私有。这样你就可以随意结合。只需确保您的Recorder类暴露所有可能性:

-(id) initWithMusic:(Music *)music; // returns MusicRecorder
-(id) initWithScene:(Scene *)scene; // returns SceneRecorder

等。在内部,您的设计可以在有意义的地方使用层次结构,而在外部,只有一个类。两个世界中最好的,IMO。