Angular2中的方法重写

时间:2016-07-06 18:12:56

标签: angular

我有两个组件,一个是父级,另一个是子级。孩子从父母延伸。 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;
    }
}

2 个答案:

答案 0 :(得分:2)

此代码不起作用的原因很简单:

let parent: ParentClass = new ParentClass();
parent.open();
parent = new ChildClass();
// what happens now?
parent.open();

在第三行代码之后,parent仍然是ParentClass的类型,因此open调用应该有效。另一方面,它包含ChildClass,因此我们没有为此方法提供必要的参数:message: string。这是一个悖论。

如果您希望此代码有效,则两种方法都应共享相同的参数。

两个提示:

  1. 避免继承。说真的,你很可能不需要它,而且很可能它只会导致问题,即使它最初看起来不像。尝试:composition over inheritance
  2. 如果您仍想按照这种方式行事,请尝试this answer

答案 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;
  }
}

看到这个问题: