swift - 使用组合时的代码共享

标签 swift oop inheritance design-patterns composition

假设我们有以下类(简化):

class AudioRecorder {
    private func onRecord(data: [Float]) {
        self.delegate?.audioRecorder(self, didRecordFrame: audioData)

    public func record() { ... }
    public func stop() { ... }
}

因此它记录帧并通知它的委托(delegate)。 现在我需要使用以下功能扩展它:

  1. 缓冲 - 缓冲 X 帧数
  2. 间隔记录-记录-停1s-记录-停1s ...
  3. 区间缓冲——记录区间和缓冲

我不能为此使用继承,因为如果 IntervalRecorderBufferingRecorder 是子类,那么我在实现 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()
  }
}

我需要在所有 IntervalRecorderBufferingRecorderIntervalBufferingRecorder 中复制播放暂停方法,然后转发到底层对象。

解决这个问题的好方法是什么?语言是 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/

相关文章:

oop - Haskell中一个简单的面向对象类 'Point'

java - 创建一个扩展类的类,并在 clojure 中覆盖

css - 标题标签不继承 CSS 属性

swift - 由于赋值语句错位,函数总是返回 nil

swift - 快速隐式转换为原始类型

ios - 使用swift从目录加载多个图像

javascript - 在方法内交换变量

c++ - V8 继承的 FunctionTemplate 没有得到对父 FunctionTemplate 的更新

javascript - 无法复制 THREE.Vector3

ios - 如何定位 SCNCamera 以便在 View 中看到对象 "just fits"?