假设我们有以下课程(简化):
class AudioRecorder {
private func onRecord(data: [Float]) {
self.delegate?.audioRecorder(self, didRecordFrame: audioData)
public func record() { ... }
public func stop() { ... }
}
所以它记录框架并通知它的代表。 现在我需要使用以下功能扩展它:
我无法使用继承,因为如果IntervalRecorder
和BufferingRecorder
是子类,那么我在实施IntervalBufferingRecorder
时遇到问题。
另一方面,使用合成解决方案时可能看起来像这样:
class BufferingRecorder {
private let recorder: AudioRecorder
func audioRecorder(recorder: AudioRecorder, didRecordFrame: [Float]) {
// buffering logic
}
// need to duplicate play and stop
func record() {
self.recorder.startRecording()
}
func stop() {
self.recorder.stop()
}
}
我需要在所有IntervalRecorder
,BufferingRecorder
和IntervalBufferingRecorder
中复制播放暂停方法,然后转发到底层对象。
对这个问题有什么好办法?语言是Swift,但我想这不是很重要。
答案 0 :(得分:1)
这可能会让您了解如何使用默认实现的协议。
protocol Bufferable {
func buffer(data: [Float])
}
extension Bufferable {
func buffer(data: [Float]) {
print("buffering")
}
}
protocol Recordable {
func record(data: [Float])
}
extension Recordable {
func record(data: [Float]) {
print("recording")
}
}
class AudioPlayer: Bufferable, Recordable {
func start() {
buffer(data: [2.0, 1.0, 1.0])
record(data: [2.0, 1.0, 1.0])
}
}
class VideoPlayer: Bufferable, Recordable {
func start() {
buffer(data: [2.0, 1.0, 1.0])
record(data: [2.0, 1.0, 1.0])
}
}