假设我们有以下类(简化):
class AudioRecorder {
private func onRecord(data: [Float]) {
self.delegate?.audioRecorder(self, didRecordFrame: audioData)
public func record() { ... }
public func stop() { ... }
}
因此它记录帧并通知它的委托(delegate)。 现在我需要使用以下功能扩展它:
- 缓冲 - 缓冲 X 帧数
- 间隔记录-记录-停1s-记录-停1s ...
- 区间缓冲——记录区间和缓冲
我不能为此使用继承,因为如果 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,但我想这不是很重要。
最佳答案
这可能会让您了解如何使用默认实现的协议(protocol)。
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])
}
}
关于swift - 使用组合时的代码共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45803648/