gpt4 book ai didi

typescript - Typescript 中的接口(interface)和抽象类有什么区别?

转载 作者:搜寻专家 更新时间:2023-10-30 20:36:48 25 4
gpt4 key购买 nike

我写了几行代码来试验和区分这两者:interfaceabstract class

我发现他们有相同的限制。

interface IPerson {
name: string;
talk(): void;
}

interface IVIP {
code: number;
}

abstract class Person {
abstract name: string;
abstract talk(): void;
}

class ManagerType1 extends Person {
// The error I get is that I need to implement the talk() method
// and name property from its base class.
}

class ManagerType2 implements IPerson {
// The error I get is that I need to implement the talk() method
// and the name property from the interface.
}


class ManagerType3 implements IPerson, IVIP {
// Now the error I get is that I need to implement all the
// properties and methods of the implemented interfaces to the derived class
}

正如我所发现的,这两者之间没有明显的区别,因为它们都实现相同的限制。我唯一注意到的是继承实现

  1. 一个类只能扩展到一个基类
  2. 一个类可以实现多个接口(interface)。

我没听错吧?如果是这样,我什么时候需要使用一个?

UPDATE

我不知道这是否是正确的答案,但您确实可以根据自己的情况同时使用两者。 OOP 真的很酷。

class ManagerType3 extends Person implements IPerson, IVIP {
// Now the restriction is that you need to implement all the abstract
// properties and methods in the base class and all
// the properties and methods from the interfaces
}

最佳答案

接口(interface)

接口(interface)一个契约,它定义了属性以及实现它的对象可以做什么。例如,您可以定义水管工电工可以做什么:

interface Electrician {
layWires(): void
}

interface Plumber {
layPipes(): void
}

然后,您可以使用接口(interface)的服务:

function restoreHouse(e: Electrician, p: Plumber) {
e.layWires()
p.layPipes()
}

请注意,实现接口(interface)的方式是自由的。您可以通过实例化一个类或使用一个简单的对象来做到这一点:

let iAmAnElectrician = {
layWires: () => { console.log("Work with wires…") }
}

接口(interface)在运行时根本不存在,因此不可能进行自省(introspection)。它是处理对象编程的经典 JavaScript 方法,但在编译时可以很好地控制定义的契约。

抽象类

既是契约也是工厂的实现抽象类 也是一个实现,但不完整。特别是,一个抽象类存在于运行时,即使它只有抽象方法(然后可以使用 instanceof)。

当您定义一个抽象类时,您通常会尝试控制必须如何实现一个过程。例如,你可以这样写:

abstract class HouseRestorer {
protected abstract layWires(): void
protected abstract layPipes(): void
restoreHouse() {
this.layWires()
this.layPipes()
}
}

这个抽象类 HouseRestorer 定义了方法 layWireslayPipes 将如何被使用,但是由子类来实现特殊处理后方可使用。

抽象类是一种传统的 OOP 方法,在 JavaScript 中不是传统的。

这两种方法都可以完成相同的事情。它们是解决问题的两种不同方法。

关于typescript - Typescript 中的接口(interface)和抽象类有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50110844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com