结构类型和多态性 - 添加超类型

时间:2018-04-28 22:14:40

标签: angular typescript design-patterns polymorphism structural-typing

下面是使用TypeScript语法

angular framework获取的示例代码(多态)
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是结构类型的......

1 个答案:

答案 0 :(得分:1)

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

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

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

  • 子类的实例应该在运行时使用child instanceof Parent

  • 标识为父类实例
  • 父类具有影响上述任何内容的装饰器

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

AbstractControlDirective包含应在子类中继承的具体成员,因此NgControl扩展了它:

export abstract class NgControl extends AbstractControlDirective {...}

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

export class HttpXsrfCookieExtractor implements HttpXsrfTokenExtractor {...}