首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用组合时的代码共享

使用组合时的代码共享
EN

Stack Overflow用户
提问于 2017-08-21 18:36:32
回答 1查看 70关注 0票数 0

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

代码语言:javascript
复制
class AudioRecorder {
    private func onRecord(data: [Float]) {
        self.delegate?.audioRecorder(self, didRecordFrame: audioData)

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

所以它记录帧并通知它的委托。现在,我需要用以下功能来扩展它:

  1. 缓冲-缓冲X帧数
  2. 间隔录音-记录-停止1-记录-停止1.
  3. 间隔缓冲-在间隔和缓冲区中的记录

我不能为此使用继承,因为如果IntervalRecorderBufferingRecorder是子类,那么实现IntervalBufferingRecorder就会有问题。

另一方面,当使用组合解决方案时,可能如下所示:

代码语言:javascript
复制
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中的播放暂停方法,并将其转发到底层对象。

什么是解决这个问题的好办法?语言是迅速的,但我想这并不是很重要。

EN

回答 1

Stack Overflow用户

发布于 2017-08-21 18:57:10

这可能会让您了解如何在默认实现中使用协议。

代码语言:javascript
复制
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])
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45803648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档