扩展和扩展之间有什么区别?和& # 39;实现# 39;在打印稿

我想知道< >强男人< / >强< >强子< / >强有什么共同点,它们有什么不同。

class Person {
name: string;
age: number;
}
class Child extends Person {}
class Man implements Person {}
170566 次浏览

短的版本

  • extends的意思是:

新班是孩子。它从继承中得到好处。它具有其父对象的所有属性和方法。它可以覆盖其中的一些并实现新的,但父内容已经包括在内。

  • implements的意思是:

新类可以被当作同样的"shape",但是它不是一个孩子. c可以被当作同样的"shape"。它可以传递给任何需要Person的方法,不管它的父方法与Person不同。

更多…

OOP(语言如c#或Java)中,我们将使用

extends继承获利。

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

implements将更多地用于多态性

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

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

class Man extends Human ...

但如果我们也声明Man可以假装是Person类型:

class Man extends Human
implements Person ...

...那么我们可以在任何需要Person的地方使用它。我们只需要满足Person的“接口”;(即实现所有公共内容)。

implement其他类?这真的很酷

Javascript的优点之一是内置对duck typing的支持。

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

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

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

为了在Typescript中不丢失它,我们可以使用更多的类型化支持来做同样的事情。这就是

class implements class

有它的作用,在有意义的地方。

C#这样的面向对象语言中,没有办法这样做。

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

接口扩展类

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

当你有一个很大的继承层次结构,但想要 指定您的代码只与具有某些属性的子类一起工作 属性。子类除了继承之外不必相互关联 从基类。例如:< / p >

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在这种情况下,它几乎像实现一个接口。子对象可以假装它是它的父对象…但是它没有得到任何实现。

你有typescript(和其他一些OO语言)的类和接口。

接口没有实现;这只是一份“合同”。此类型拥有的成员/方法。
例如:< / p >

interface Point {
x: number;
y: number;
distance(other: Point): number;
}
实现这个Point接口的实例必须有两个number类型的成员:xy', and one method, distance, which receives another Pointinstance and returns anumber '。

类是实现:

class PointImplementation implements Point {
public x: number;
public y: number;
    

constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
    

public distance(other: Point): number {
return Math.sqrt(Math.pow(this.x - other.x, 2) + Math.pow(this.y - other.y, 2));
}
}

(操场上的代码)

在你的例子中,当你扩展你的Person类时,你把它当作一个类,当你实现它时,你把它当作一个接口。
代码:< / p >
class Person {
name: string;
age: number;
}
class Child  extends Person {}


class Man implements Person {}

它有一个编译错误说:

类“Man”错误地实现了接口“Person”。

. type 'Man'中缺少属性' name'
这是因为接口缺乏实现。
所以如果你implement一个类,那么你只取它的“契约”;没有实现,所以你需要这样做:

class NoErrorMan implements Person {
name: string;
age: number;
}

(操场上的代码)

底线是在大多数情况下你想extend另一个类,而不是implement它。

来自@nitzan-tomer的精彩回答!帮了我很多…我扩展了他的演示:

IPoint interface;
Point implements IPoint;
Point3D extends Point;

以及它们在期望IPoint类型的函数中的行为。

因此,到目前为止,我学到的并一直作为经验法则使用的是:如果您正在使用期望泛型类型的类和方法,则使用接口作为期望的类型。并确保父类或基类使用该接口。这样,只要它们实现了接口,您就可以使用其中的所有子类。

这里是扩展的演示

  1. 接口用形状扩展接口
  2. 接口用形状扩展类
  3. 类实现接口应该实现接口提供的所有字段
  4. 类使用形状实现类
  5. 类用所有字段扩展类

extends关注继承,implements关注约束,无论是接口还是类。

扩展VS实现

  • extends:子类(被扩展的)将继承类的所有属性和方法被扩展
  • implements:使用implements关键字的类需要实现implements的类的所有属性和方法

简单来说:

  • extends:在这里你从父类中获得所有这些方法/属性,所以你不必自己实现
  • implements:这是类必须遵循的契约。类必须至少实现以下方法/属性

例子:

class Person {
name: string;
age: number;


walk(): void {
console.log('Walking (person Class)')
}


constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
class child extends Person { }


// Man has to implements at least all the properties
// and methods of the Person class
class man implements Person {
name: string;
age: number


constructor(name: string, age: number) {
this.name = name;
this.age = age;
}


walk(): void {
console.log('Walking (man class)')
}


}


(new child('Mike', 12)).walk();
// logs: Walking(person Class)


(new man('Tom', 12)).walk();
// logs: Walking(man class)

在这个例子中,我们可以观察到子类继承了Person的所有内容,而man类必须实现Person本身的所有内容。

如果我们要从man类中删除一些东西,例如walk方法,我们将得到以下编译时错误:

类'man'错误地实现了类'Person'。你的意思是 扩展'人'并继承其成员作为子类?财产 在类型“man”中缺少“walk”,但在类型“Person”中需要“walk”

基本上:

  • extends将获得父类的所有属性和方法。
  • implements将强制我们实现接口中定义的所有属性和方法。