带有内置类的多个类扩展



我一直在查看typescript中的mixins,想知道如何实现我的问题。我有四个类:

AudioNode (native)
CustomAudioNode ( custom )
GainNode ( native )
CustomGainNode ( custom )

我想实现这个继承:

  • 1CustomAudioNode扩展AudioNode.
  • 2GainNode扩展CustomAudioNode
  • 3CustomGainNode扩展GainNode[GainNode,CustomAudioNode].

我怎样才能做到这一点?

不可能直接建立像OP正在寻找的关系,这涉及原生AudioNode和原生GainNode,每个都有另一个自定义实现(CustomAudioNodeCustomGainNode),其中…

  1. CustomAudioNode扩展AudioNode.
  2. GainNode扩展CustomAudioNode.
  3. CustomGainNode扩展GainNode[GainNode,CustomAudioNode]

这是由于…

  • GainNode已经扩展了AudioNode.
  • AudioNode既不能扩展也不能以任何有意义的方式包装(因此,它将保持不变)。

但是可以做的是…

  • 提供任何与AudioNode相关的额外行为作为mixin,最好实现为基于函数的mixin。

这是,一个提供了一个非常干净的代码库,现在只涉及一个CustomGainNode扩展原生对应并提供自定义增益节点行为,而自定义音频节点行为是单独实现的,但在任何自定义增益节点的构建/实例化时间应用。

// the pure custom audio node specific functionality.
function customAudioNodeBahavior01() {
// `this` refers to the current `CustomGainNode` instance
//  which too is an instance of `GainNode` and `AudioNode`.
}
function customAudioNodeBahavior02() {
// `this` refers to the current `CustomGainNode` instance
//  which too is an instance of `GainNode` and `AudioNode`.
}
// the function based mixin.
function withCustomAudioNodeBahavior() {
Object.assign(this, {
customAudioNodeBahavior01,
customAudioNodeBahavior02,
});
}
// the custom gain node subclass/subtype.
class CustomGainNode extends GainNode {
constructor(...args) {
// - `args` are always ...
//   `context`and `options`
//   ... like with ...
//   ```
//   constructor(context, options) {
//     super(context, options);
//     // ...
//   }
//   ```
// the inheritance part.
super(...args);
// the mixin based composition part.
withCustomAudioNodeBahavior.call(this);
// - implementing further custom gain node
//   specific behavior.
}
}

注意

为了符合Web Audio Api, OP可能会考虑实现BaseAudioContext.createGain工厂方法的挂起…比如BaseAudioContext.createCustomGain.

相关内容

  • 没有找到相关文章

最新更新