1

下面是使用 TypeScript 语法取自Angular框架的示例代码(多态),

export abstract class AbstractControlDirective {
   ...
}

AbstractControlDirective亚型

export abstract class NgControl extends AbstractControlDirective {
     ...
}
export abstract class ControlContainer extends AbstractControlDirective {
   ...
}
export declare abstract class ControlContainer extends AbstractControlDirective {
  ...
}
export declare abstract class NgControl extends AbstractControlDirective {
    ...
}

NgControl亚型

export class NgModel extends NgControl implements OnChanges, OnDestroy {
   ...
}

export class FormControlDirective extends NgControl implements OnChanges {
    ....
}

export class FormControlName extends NgControl implements OnChanges, OnDestroy {
   ...
}

export declare class FormControlDirective extends NgControl implements OnChanges {
    ...
}

export declare class FormControlName extends NgControl implements OnChanges, OnDestroy {
   ...
}

export declare class NgModel extends NgControl implements OnChanges, OnDestroy {
   ...
}

一般来说,有很多情况会遇到新的需求,在类层次结构的中间层中添加明显的超类型,这会在子类型中注入破坏,除非使用某种设计模式。使用设计模式可以使类层次结构不易出错,但会破坏层次结构。


为了避免这个问题,我们可以在不使用extends关键字的情况下保持这种层次结构吗?TypeScript 是结构类型的...

4

1 回答 1

1

extends如果满足以下一个或多个条件,则一个类应该从父级(ES6 类中的关键字)继承:

  • 父类具有显式构造函数,应该在子类中继承,包括类字段和构造函数参数属性(它们是 ES6 类构造函数体的语法糖)。

  • 父类具有应出现在子类中的具体原型成员(方法和 getter/setter)

  • 子类的实例应该在运行时可识别为父类实例child instanceof Parent

  • 父类具有影响上述任何内容的装饰器

否则继承不会提供任何好处并导致过多的原型链;子类可以只实现父接口(implements关键字)。

AbstractControlDirective包含应在子类中继承的具体成员,因此对其进行NgControl扩展:

export abstract class NgControl extends AbstractControlDirective {...}

HttpXsrfTokenExtractor仅包含抽象成员,因此HttpXsrfCookieExtractor不需要扩展它,只需将其实现为接口:

export class HttpXsrfCookieExtractor implements HttpXsrfTokenExtractor {...}
于 2018-04-28T23:25:18.530 回答