我有两个组件,一个是父级,另一个是子级。孩子从父母延伸。 Parent有一个方法open()。 Child通过重写和添加参数来重载open()。它会导致错误:open()是一个属性,并且属性类型在各个类之间不匹配。
open() => void
不等于
open(message: string) => void
家长:
export class ParentClass {
constructor() { super(); }
open(){
return "Hello World!";
}
}
子:
export class ChildClass extends ParentClass {
constructor() { super(); }
open(message: string){
return message;
}
}
答案 0 :(得分:2)
此代码不起作用的原因很简单:
let parent: ParentClass = new ParentClass();
parent.open();
parent = new ChildClass();
// what happens now?
parent.open();
在第三行代码之后,parent
仍然是ParentClass
的类型,因此open
调用应该有效。另一方面,它包含ChildClass
,因此我们没有为此方法提供必要的参数:message: string
。这是一个悖论。
如果您希望此代码有效,则两种方法都应共享相同的参数。
两个提示:
答案 1 :(得分:0)
我认为你需要在子类中使用相同的签名:
export class ParentClass {
constructor() {
}
open(message:string){ // <-----
return "Hello World!";
}
}
export class ChildClass extends ParentClass {
constructor() { super(); }
open(message: string){
return message;
}
}
或者在子类中使参数可选:
export class ParentClass {
constructor() {
}
open(message:string){
return "Hello World!";
}
}
export class ChildClass extends ParentClass {
constructor() { super(); }
open(message?: string){ // <-----
return message;
}
}
看到这个问题: