【问题标题】:Method overriding in Angular2Angular2中的方法覆盖
【发布时间】:2016-11-08 21:57:12
【问题描述】:

我有两个组件,一个是父组件,另一个是子组件。孩子从父母延伸。 Parent 有一个方法 open()。子重载 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;
    }
}

【问题讨论】:

    标签: angular


    【解决方案1】:

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

    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

    【讨论】:

      【解决方案2】:

      我认为子类中的方法需要相同的签名:

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

      看到这个问题:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-15
        • 2012-12-03
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        • 1970-01-01
        相关资源
        最近更新 更多