【发布时间】:2019-02-01 15:30:35
【问题描述】:
我正在尝试创建一个应该能够扩展多个基类的类。在下面的示例中,我想使用石头或木头作为教室的基类。为此,我尝试创建一个可以选择适当基类的材料类。但我不让它工作。
const EventEmitter = require('events').EventEmitter;
class Stone extends EventEmitter{
constructor(weight, color){
super();
this.color = color;
this.weight = weight;
this.hard = true
this.start();
}
testEmitterFunction(){
this.emit('test');
}
start(){
setInterval(this.testFunc.bind(this), 500);
}
}
class Wood{
constructor(weight, color){
this.color = color;
this.weight = weight;
this.hard = false;
}
}
class Material{
constructor(mat, weight, color){
switch(mat){
case 'wood': return new Wood(weight, color);
case 'stone': return new Stone(weight, color);
}
}
}
class House extends Material{
constructor(mat, weight, color, name){
super(mat, weight, color)
this.name = name;
this.on('test', (arg) => {
console.log('1')
});
this.test();
}
test(){
console.log('test house function');
}
}
class House2 extends Stone{
constructor(weight, color, name){
super(weight, color)
this.name = name;
this.on('test', (arg) => {
console.log('2')
});
this.test();
}
test(){
console.log('test house2 function');
}
}
const home = new House('stone', 8, 'green', 'homesweethome');
const home2 = new House2(8, 'green', 'homesweethome');
我希望该实例 home 具有与实例 home2 相同的行为。但在这种情况下,执行 console.log('test house function') 的测试功能不起作用。我尝试了其他解决方案,但 EventEmitter 不起作用或石头属性不可用。
【问题讨论】:
-
也许你应该重新考虑你的结构并使用组合而不是如此深层次的继承。 Wood and Stone 可以扩展 Material,House 可以由材料和其他数据类型组成,即
this.material = new Wood()。如果您对此感兴趣,我可以举个例子回答 -
问题是,在我的现实生活场景中,我也希望能够为我的房子使用来自石头的 EventEmitter。即
house.on(...)而不是house.stone.on(...)。 -
使用合成并在您的房屋中创建一个事件发射器,然后将其传递给您的材质。
-
真实案例而不是抽象可能会更好地了解您要实现的目标。为什么 Stone 不继承 EE 而 Wood 不继承?那个 Material 是一个外观看起来很可疑。最可疑的部分是 House 可能没有
on方法,而它希望它存在。 -
@Lester 抱歉,我的意思是在
House中你可以on() {.....}如果你还需要this绑定到House而不是Material你可以on() { this.material.on.bind.apply(this, [null, ...arguments])); }
标签: javascript node.js oop ecmascript-6