【问题标题】:Structural typing and Polymorphism - Adding super types结构类型和多态 - 添加超类型
【发布时间】:2018-04-28 22:14:39
【问题描述】:

以下是使用 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 被结构化类型化...

【问题讨论】:

  • 我能想到的只是使用接口或implementing,而不是扩展抽象类。您认为可以防止这种情况的设计模式是什么?我很想看看他们

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


【解决方案1】:

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

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

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

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

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

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

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

export abstract class NgControl extends AbstractControlDirective {...}

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

export class HttpXsrfCookieExtractor implements HttpXsrfTokenExtractor {...}

【讨论】:

  • 对于您的观点:父类具有应出现在子类中的具体成员。您是否遇到过这样一种情况,您在父类中添加了一个需要 4 个子类但不需要 2 个其他子类的方法(因为它没有意义)。很容易说,当我们进入这个场景时,类层次结构设计得不好。但是,您会如何应对这种情况?
  • 首先,如果有 2 个或更多子班级受到影响,我为什么要关心?我只想针对这 4 个子类。对于这 2 个类别,我实时遇到了数十个在代码投入生产后受到影响的类。
  • 从测试方面来看,范围扩大,对于这样的变化
  • 所以,我想了解,我们如何在不使用 extend 关键字的情况下维护类型关系。你的前两个要点中提到的要点不能用作文来处理吗?第三点使用结构类型?
  • 您可以使用接口继承或联合类型来维护类型继承(它们大多可以互换,但可能存在一些差异,stackoverflow.com/a/49723584/3731501)。目前尚不清楚为什么该主题对您来说是个问题。如果你需要继承,你就需要它(when you don't 的情况除外)。继承的替代方法是将相同的方法发布到实现相同接口的类,这是一个禁忌。你不能用结构类型来模仿项目符号——这就是继承的目的。
猜你喜欢
  • 2018-10-22
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多