我想知道男人和孩子有什么共同之处,又有什么不同之处。

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

当前回答

扩展VS实现

extends:子类(被扩展的)将继承类的所有属性和方法 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将要求我们实现接口中定义的所有属性和方法。

扩展VS实现

extends:子类(被扩展的)将继承类的所有属性和方法 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”。

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

IPoint interface;
Point implements IPoint;
Point3D extends Point;

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

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

这里是扩展演示

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

接口没有实现;它只是这种类型的成员/方法的“契约”。 例如:

interface Point {
    x: number;
    y: number;
    distance(other: Point): number;
}

实现这个Point接口的实例必须有两个number类型的成员:x和y',还有一个方法distance,它接收另一个Pointinstance并返回一个number '。 接口没有实现这些。

类是实现:

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类时将它作为类对待,在实现它时将它作为接口对待。 你的代码:

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

class Man implements Person {}

它有一个编译错误说:

类“Man”错误地实现了接口“Person”。 属性“name”在类型“Man”中缺失。

这是因为接口缺乏实现。 所以如果你实现了一个类,那么你只需要它的“契约”而不需要实现,所以你需要这样做:

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

(操场上的代码)

底线是,在大多数情况下,您希望扩展另一个类,而不是实现它。