下面是使用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是结构类型的......
答案 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 {...}