可以覆盖(更改参数)超类方法

时间:2020-10-19 13:38:17

标签: typescript inheritance parent-child

我遇到了以下问题,我有2个课程,即

class Animal {
  public talk() {
    console.log('...');
  }
}

class Dog extends Animal {
  public talk(noise: string) {
    console.log(noise);
    super.talk()
  }
}

如您所见,原始的Animal.talk方法没有参数,并且由于我的应用程序的限制,它没有任何参数,但是扩展它的某些类可以加入附加的noise参数。由于此参数最初不在Animal上,因此会引发类型错误。因此,我想问一下如何正确处理此问题。

这是一个非常简化的示例,实际用例具有各种类型的noise,并且我想避免将所有这些都定义为Animal.talk的可能值,并且理想情况下不要使用任何参数; < / p>

1 个答案:

答案 0 :(得分:1)

在这种情况下,Dog必须同时接受talk("string")talk()。如果将Dog传递给带有Animal的函数,则该函数必须能够调用animal.talk()(否则您违反了substitutability)。这意味着noise必须是可选的:

class Dog extends Animal {
  public talk(noise?: string) {
    console.log(noise);
    super.talk()
  }
}

然后,您只需要处理未通过noise的情况。 (但这是不可避免的。您将始终不得不处理未通过noise的情况。)

相关问题