说我有一些像下面这样的类层次结构。引擎类是否可以访问父级的someMethod()方法?
class vehicle{
constructor(){
this.eng = new engine();
...
}
someMethod(a){
...
}
...
}
class engine{
...
}
答案 0 :(得分:1)
有很多方法可以解决您想要的事情,而您必须问自己:从概念上讲,这应该如何工作?
您必须重新考虑整个情况。最重要的是,为什么引擎要关心它所在的车辆?车辆只在乎引擎在做什么,而不在乎其他方面。
因此,假设您在车辆上有一种start
方法。看起来像
start() {
this.engine.start().then(function(infofromengine) {
console.log('engine started', infofromengine);
}, function(errorfromengine) {
console.log('error in engine start', errorfromengine);
}
}
在您的引擎中,您将拥有start
方法,该方法返回Promise以及车辆可能需要了解的有关引擎的任何信息;
您还可以在初始化车辆中的引擎时,设置各种事件发射器,并在您的车辆构造函数中挂钩这些发射器。
更进一步,您可能需要一些子组件,以便彼此了解。因此,您可以在构造中“连接它们”。一个与此矛盾的例子可能在您的车辆构造器中
constructor() {
this.checkEngineLight = new Light();
this.engine = new Engine({checkEngineLight});
}
在引擎中
constructor(config) {
let {checkEngineLight} = config;
this.engineLight = checkEngineLight;
}
someEngineAction() {
if (some_error_happens) this.engineLight.toggle(true, someerrorid);
}
我们之所以被称为“软件工程师”或“软件架构师”,是有原因的。我们不仅要编写代码,还必须考虑代码如何与所有活动部件交互。
但是要更直接地回答您的问题,在“引擎”绝对必须直接访问“车辆”的情况下,您必须向引擎“ 告诉”……就像您对检查引擎指示灯的描述:new Engine(this)
,而引擎构造函数将为constructor(vehicle)
答案 1 :(得分:0)
对此问题有两种解决方法
首先,如果您像这样继承父级的属性:
class engine extends vehicle {
someMethod(a) { // method name has to be the same name as parent, calling super calls vehicle's someMethod(a) method
super(a); // vehicle.super called
}
}
或创建车辆实例并调用方法
class engine {
someMethod(a) { // can be any name, as long as its using v.someMethod(a)
const v = new vehicle();
v.someMethod(a);
}
}