如何从父类Feature的方法调用子类方法并传递参数
如何在父类方法中调用子类的方法并传递参数?
现有如下代码结构:
子类(AppComponent)代码:
import { Component, VERSION } from '@angular/core'; import { Feature } from './super.component'; @Component({ selector: 'my-app', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], }) export class AppComponent extends Feature { name = 'Angular ' + VERSION.major; constructor() { super(); } superToCall(value) { console.log('value', value); } }
父类(Feature)代码:
export class Feature { childCalled(value) { console.log('child called', value); } }
需求是在父类Feature的childCalled方法中,调用子类AppComponent的superToCall方法并传递参数,以下是两种可行方案:
方案1:父类定义占位方法(推荐,符合面向对象多态特性)
在父类中预先定义superToCall方法(空实现或抽象方法),让子类重写该方法,父类即可直接通过this调用,天然支持多态。
修改后的父类代码:
export class Feature { childCalled(value) { console.log('child called', value); // 调用子类重写的superToCall并传递参数 this.superToCall(`${value}_from_parent`); } // 定义占位方法,提示子类需要重写 superToCall(value: any) { // 可选:抛出错误强制子类实现 // throw new Error("子类必须重写superToCall方法"); } }
子类代码无需修改,本身已经重写了superToCall方法。当调用父类的childCalled时,会自动执行子类的superToCall逻辑,比如在子类构造函数中测试:
constructor() { super(); this.childCalled('test_param'); }
控制台会输出:
child called test_param value test_param_from_parent
方案2:使用类型断言(不推荐,耦合性高)
如果不想修改父类方法定义,可以通过类型断言将this强制转为子类类型,从而调用子类方法:
修改后的父类代码:
export class Feature { childCalled(value) { console.log('child called', value); // 通过类型断言调用子类方法 (this as unknown as AppComponent).superToCall(`${value}_from_parent`); } }
这种方式的缺点是父类强依赖具体子类,违反依赖倒置原则,后续子类名称、方法变更时会导致父类代码报错,仅适合临时场景使用。
内容的提问来源于stack exchange,提问作者3gwebtrain
相关产品推荐
相关产品推荐

