【问题标题】:Why is Typescript calling an overridden child method from within the parent class if I call child.listen()? [duplicate]如果我调用 child.listen(),为什么 Typescript 从父类中调用覆盖的子方法? [复制]
【发布时间】:2021-07-07 17:30:14
【问题描述】:
class Base {

    setupServer(){
        console.log("BaseClass")
    }

    listen() {
        this.setupServer();
    }
}

class Child extends Base {

    setupServer() {
        console.log("ChildClass")
    }
}

const child = new Child();
child.listen();

为什么会打印出:ChildClass?我希望Base 类中的this 只能在同一类中看到setupServer 方法。有没有办法从子实例调用listen 函数,然后仍然先执行BasesetupServer() 方法,而不在子类中执行super.setupServer()

【问题讨论】:

  • 继承就是这样工作的。当前对象 (this) 只有一个同名的方法,并且在子版本中是子版本。 this 指的是当前对象,而不是类。
  • 您可以通过 super.setupServer() 从 Child 调用 Base 的 setupServer 方法,但正如 @deceze 所说,您看到的行为是一种覆盖方法的重点。
  • 好吧,这是有道理的,但是如果我从 Base 类中删除 setupServer() 方法,编译器会因为监听方法中的 this.setupServer() 而报错。这是因为编译器不知道子类包含实现吗?
  • @Loupi TS 不能让你这样做,因为这样你就可以从基类本身创建无效对象。
  • 如果你从基类中移除它,那么你有可能实例化基类,然后你的代码就会中断。那么它就不是类型安全了。

标签: javascript typescript class inheritance this


【解决方案1】:

this 在函数中取决于它的执行方式。这里它在子实例上执行,因此将调用子实例的setupServer 方法。

关于为什么从基类中删除setupServer会在TS中显示错误的问题:

class Base {

    listen() {
        this.setupServer();
    }
}

class Child extends Base {

    setupServer() {
        console.log("ChildClass")
    }
}

const child = new Child();
child.listen();

这很简单,在这种情况下,您可以随时从基类创建一个对象,当您调用this.listen() 时会失败。即使稍后在子类中定义了 setupServer 函数,Typescript 也不能​​让你这样做。

【讨论】:

    【解决方案2】:

    即使您子类化另一个类:一个实例也只是一个 this 对象,即使基类上的方法开始使用它。

    所以在您的示例中,当Base 类上的listen 方法调用this.setupServer() 时,this 仍然是child,它是Child 的一个实例,以及@ 的分层查找因此,987654328@ 将匹配Child 上定义的那个。

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 2020-11-04
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      相关资源
      最近更新 更多