假设我们有以下类(简化):
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中的播放暂停方法,并将其转发到底层对象。
什么是解决这个问题的好办法?语言是迅速的,但我想这并不是很重要。
发布于 2017-08-21 18:57:10
这可能会让您了解如何在默认实现中使用协议。
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])
}
}https://stackoverflow.com/questions/45803648
复制相似问题