我一直在查看typescript中的mixins,想知道如何实现我的问题。我有四个类:
AudioNode (native)
CustomAudioNode ( custom )
GainNode ( native )
CustomGainNode ( custom )
我想实现这个继承:
- 1
CustomAudioNode
扩展AudioNode
. - 2
GainNode
扩展CustomAudioNode
- 3
CustomGainNode
扩展GainNode
或[GainNode,CustomAudioNode]
.
我怎样才能做到这一点?
不可能直接建立像OP正在寻找的关系,这涉及原生AudioNode
和原生GainNode
,每个都有另一个自定义实现(CustomAudioNode
和CustomGainNode
),其中…
CustomAudioNode
扩展AudioNode
.GainNode
扩展CustomAudioNode
.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
.