TypeScript 中的“扩展”和“实现”有什么区别

新手上路,请多包涵

我想知道 ManChild 有什么共同点以及它们有何不同。

 class Person {
  name: string;
  age: number;
}
class Child extends Person {}
class Man implements Person {}

原文由 davejoem 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 435
2 个回答

精简版

  • extends 表示:

新班是一个孩子。它得到继承带来的好处。它具有其父级的所有属性和方法。它可以覆盖其中的一些并实现新的,但是已经包含了父级的东西。

  • implements 表示:

新类 可以被视为 相同的 “形状” ,但 它不是子 类。它可以传递给需要 Person 的任何方法,无论其父级是否与 Person 不同。

更多的 …

OOP (C# 或 Java 等语言)中,我们会使用

extends继承 中获利。

…在大多数基于类的面向对象语言中,继承是一种机制,其中一个对象获取父对象的所有属性和行为。继承允许程序员: 创建基于现有类的类 …

implements 将更多用于 多态性

…多态性是为不同类型的实体提供单一接口…

所以我们可以为我们的类 Man 拥有一个完全不同的继承树:

 class Man extends Human ...

但如果我们还声明 Man 可以伪装成 Person 类型:

 class Man extends Human
          implements Person ...

…然后我们可以在任何地方使用它 Person 是必需的。我们只需要实现 Person 的“接口”(即实现其所有公共内容)。

implement 其他类?这真是很酷的东西

Javascript 的漂亮外观(好处之一)是对 鸭子类型 的内置支持。

“如果它走路像鸭子,叫起来像鸭子,那它一定是鸭子。”

因此,在 Javascript 中,如果两个不同的对象有一个相似的方法(例如 render() ),它们可以传递给期望它的函数:

 function(engine){
  engine.render() // any type implementing render() can be passed
}

为了不在 Typescript 中丢失这一点,我们可以通过更多类型的支持来做同样的事情。这就是

class implements class

有它的作用,它是有意义的。

在 OOP 语言中,如 C# ,没有办法做到这一点。

文档应该在这里有所帮助:

接口扩展类

当接口类型扩展类类型时,它继承类的成员,但不继承它们的实现。就好像接口已经声明了类的所有成员,但没有提供实现。接口甚至继承基类的私有成员和受保护成员。这意味着当您创建一个扩展具有私有或受保护成员的类的接口时,该接口类型只能由该类或其子类实现。

当您有一个大的继承层次结构,但想要指定您的代码仅适用于具有某些属性的子类时,这很有用。除了从基类继承之外,子类不必相关。例如:

 class Control {
    private state: any;
}

interface SelectableControl extends Control {
    select(): void;
}

class Button extends Control implements SelectableControl {
    select() { }
}

class TextBox extends Control {
    select() { }
}

// Error: Property 'state' is missing in type 'Image'.
class Image implements SelectableControl {
    private state: any;
    select() { }
}

class Location {

}

所以,虽然

  • extends 意味着它从它的父母那里得到所有
  • implements 在这种情况下,它几乎就像实现一个接口。子对象可以假装它是它的父对象……但它没有得到任何实现。

原文由 Radim Köhler 发布,翻译遵循 CC BY-SA 4.0 许可协议

基本上:

  • extends 会得到父类的所有属性和方法。
  • implements 将要求我们实现接口中定义的所有属性和方法。

原文由 Pouya Jabbarisani 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进