示例:
class Parent { constructor() {} }
class Child { constructor() { super(); someChildCode(); } }
我只想在someChildCode()之后执行一些代码。是的,我可以把它放在那里,但要求不是那里放置那些代码。
因为有太多(n)个子类,只有一个父类,所以我想不重复代码(n)次。
P.S。我想要在创建子对象时像创建新的Child()一样简单的代码解决方案。
P.S。 Downvoter,关心解释?我意识到这个任务可能无法解决,这就是我提出这个问题的原因,以确定是否是这种情况。
答案 0 :(得分:1)
如果您确实需要在构造时在每个子类中运行完全相同的代码,那么该公共代码可能属于父构造函数。但也许您需要一些特定于孩子的代码才能在公共代码之前运行,在这种情况下,您仍有问题。
无论哪种方式,一种可能的解决方案是根本不覆盖子类中的构造函数,而是让它们继承父构造函数,该构造函数包含任何公共代码以及可以覆盖的前后挂钩。必要的儿童班。例如:
class Parent {
// do not override the constructor, conceptually "final"
constructor() {
this.beforeCommonConstructorCode();
// add any common constructor code here
console.log("Common constructor code")
this.afterCommonConstructorCode();
}
// override this in child classes as needed
public beforeCommonConstructorCode() {
// empty
}
// override this in child classes as needed
public afterCommonConstructorCode() {
// empty
}
}
new Parent();
// in console:
// >> Common constructor code
当你继承Parent
时,你只留下构造函数并将代码添加到适当的方法中:
class Child extends Parent {
// remember, do not override constructor
public beforeCommonConstructorCode() {
console.log("Child pre-constructor code")
}
public afterCommonConstructorCode() {
console.log("Child post-constructor code")
}
}
new Child();
// in console:
// >> Child pre-constructor code
// >> Common constructor code
// >> Child post-constructor code
请注意,TypeScript不会阻止子类覆盖构造函数(there is no "final
" keyword or functionality),因此需要遵守规则。否则,我认为这表现得像你喜欢的样子;您不必在每个子类中放置公共代码。
希望有所帮助。祝你好运。
答案 1 :(得分:0)
如果我理解正确的话,你可以有一个中间的父母来实现这个目标,因为你的代码是通用的,不依赖于孩子。
class Parent(){
}
class InterMediateParent extends Parent{
constructor(){
super();
someCode();
}
}
class Child extends InterMediateParent{
constructor(){
super();
}
}
答案 2 :(得分:0)
您可以将该函数添加到 Parent原型,以便只在所有子对象中维护一个副本,并在子构造函数中调用该函数。
class Parent {
constructor() {
}
}
Parent.prototype.someCommonCode = function() {
console.log("Common code for all Parent as well as it's child objects");
}
class Child extends Parent {
constructor() {
//Child class code
super();
//Some child code
this.someChildCode();
//Call Parent's common function
super.someCommonCode();
}
someChildCode() {
console.log("Some child code");
}
}
let child1 = new Child();
let child2 = new Child();