【问题标题】:How to use one class to extend multiple classes (not multiple inheritance)?如何使用一个类扩展多个类(不是多重继承)?
【发布时间】:2020-10-27 21:27:54
【问题描述】:

这里有几个 JS 类。 GrandChildOne 和 GrandChildTwo 类是相同的,但扩展了不同的父类。由于他们的代码是相同的,我正在寻找摆脱这种重复的方法。换句话说,我想要一个类(我们称之为GrandChild)并用它来扩展ChildOne 和ChildTwo 类。有什么建议吗?

class Parent {
  someParentMethod () {
     console.log('Parent')
  }
}

class ChildOne extends Parent {
   someChildOneMethod () {
     console.log('someChildOneMethod')
  }
}

class ChildTwo extends Parent {
   someChildTwoMethod () {
     console.log('someChildTwoMethod')
   }
}


// THE CLASSES BELOW ARE IDENTICAL
class GrandChildOne extends ChildOne {
   someGrandChildMethod() {
     console.log('someGrandChildMethod')
   }
}
class GrandChildTwo extends ChildTwo {
   someGrandChildMethod() {
     console.log('someGrandChildMethod')
   }
}

const grandChildOne = new GrandChildOne()
const grandChildTwo = new GrandChildTwo()

【问题讨论】:

  • “如何使用一个类扩展多个类(不是多重继承)”“不是多重继承”是什么意思?扩展多个类就是多重继承。我假设你知道不支持。所以我想说你应该将这个通用代码提升到通用基础或使用其他方法(mixin、composition)
  • By ("not multiple继承") 我的意思是说我不是在寻找像class Child extends ParentOne, ParentTow {}这样的东西(我不确定它是否不受支持)。但是,是的,你是对的——mixin 是一种方法。谢谢你,先生!

标签: javascript javascript-objects javascript-inheritance


【解决方案1】:

您可以为此使用 Mix-ins (example in MDN)

应该是这样的:

class Parent {
  someParentMethod () {
     console.log('Parent')
  }
}

class ChildOne extends Parent {
   someChildOneMethod () {
     console.log('someChildOneMethod')
  }
}

class ChildTwo extends Parent {
   someChildTwoMethod () {
     console.log('someChildTwoMethod')
   }
}


// define GrandChild as a Mix-in:
let GrandChild = Base => class extends Base {
  someGrandChildMethod() {
     console.log('someGrandChildMethod')
   }
};

//Then:
class GrandChildOne extends GrandChild(ChildOne) { }
class GrandChildTwo extends GrandChild(ChildTwo) { }

const grandChildOne = new GrandChildOne()
const grandChildTwo = new GrandChildTwo()

grandChildOne.someChildOneMethod();
grandChildTwo.someChildTwoMethod();

【讨论】:

  • 这正是我所需要的!先生,您是个传奇人物!
猜你喜欢
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多