Typescript中的接口和抽象类有啥区别?

     2023-03-13     94

关键词:

【中文标题】Typescript中的接口和抽象类有啥区别?【英文标题】:What is the difference between interface and abstract class in Typescript?Typescript中的接口和抽象类有什么区别? 【发布时间】:2018-10-11 03:48:32 【问题描述】:

我写了几行代码来试验和区分这两者: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

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

    一个类只能扩展为一个基类 一个类可以实现多个接口。

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

更新

我不知道这是否是正确的答案,但您可以根据自己的情况真正使用 BOTH。 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

【问题讨论】:

除了限制基类可以提供实现/部分实现,接口只定义shape/contract @AlekseyL。是的,非常感谢,我发现接口是用于标准的,与抽象类相同,但是您可以为每个派生类添加一些持久的方法。 Difference between interfaces and classes in Typescript的可能重复 【参考方案1】:

接口

interface一个合同,它定义了属性以及实现它的对象可以做什么。例如,您可以定义 PlumberElectrician 可以做什么:

interface Electrician 
  layWires(): void


interface Plumber 
  layPipes(): void

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

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

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

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

接口在运行时根本不存在,因此无法进行自省。它是处理对象编程的经典 JavaScript 方式,但在定义的合约的编译时具有良好的控制。

抽象类

class 既是合同,也是工厂的实施abstract class 也是一个实现,但不完整。特别是在运行时存在抽象类,即使它只有抽象方法(那么instanceof可以使用)。

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

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

这个抽象类HouseRestorer 定义了如何使用方法layWireslayPipes,但是在使用之前需要由子类来实现专门的处理。

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

这两种方法都允许做同样的事情。但它们是解决问题的两种不同方式。

【讨论】:

【参考方案2】:

TypeScript 的一个更大区别是(抽象)类在运行时可用,而接口仅在编译时可用。这意味着您不能将instanceof 与接口一起使用。

let x: any;

if (x instanceof IPerson)  // Error: 'IPerson' only refers to a type, but is being used as a value here.



if (x instanceof Person)  // OK


如果您真的不需要运行时类型,例如上面的示例,或者只想在具体类中实现,请选择接口。由于它们只是编译时的,所以生成的 JS 的大小会更小。

【讨论】:

接口和抽象类有啥区别? [复制]

】接口和抽象类有啥区别?[复制]【英文标题】:Whatisthedifferencebetweenaninterfaceandanabstractclass?[duplicate]接口和抽象类有什么区别?[复制]【发布时间】:2011-05-0619:56:32【问题描述】:可能重复:InterfacevsAbstractClass(generalOO)我不太清... 查看详情

接口和抽象类有啥区别? [复制]

】接口和抽象类有啥区别?[复制]【英文标题】:What\'sthedifferencebetweenaninterfaceandanabstractclass?[duplicate]接口和抽象类有什么区别?[复制]【发布时间】:2010-10-1511:02:58【问题描述】:重复:Whentouseaninterfaceinsteadofanabstractclassandvicever... 查看详情

java 8中的接口和抽象有啥区别? [复制]

】java8中的接口和抽象有啥区别?[复制]【英文标题】:Whatisdifferencebetweeninterfaceandabstractioninjava8?[duplicate]java8中的接口和抽象有什么区别?[复制]【发布时间】:2019-03-0222:54:25【问题描述】:现在接口也有一些方法体作为抽象类... 查看详情

java接口和类有啥区别?

...方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在Java中,接口类型可用... 查看详情

TypeScript 中的“声明类”和“接口”有啥区别

】TypeScript中的“声明类”和“接口”有啥区别【英文标题】:What\'sthedifferencebetween"declareclass"and"interface"inTypeScriptTypeScript中的“声明类”和“接口”有什么区别【发布时间】:2012-12-3000:13:01【问题描述】:在TypeScr... 查看详情

抽象类和静态类有啥区别?

】抽象类和静态类有啥区别?【英文标题】:What\'sthedifferencebetweenanabstractclassandastaticone?抽象类和静态类有什么区别?【发布时间】:2011-01-2408:22:00【问题描述】:两者都不是可实例化的。有什么区别?在什么情况下您可以使用... 查看详情

php中的抽象和接口有啥区别? [复制]

】php中的抽象和接口有啥区别?[复制]【英文标题】:Whatisthedifferencebetweenabstractandinterfaceinphp?[duplicate]php中的抽象和接口有什么区别?[复制]【发布时间】:2011-04-0408:59:57【问题描述】:可能重复:PHP:Whatisthedifferencebetweenaninterface... 查看详情

zbb20180827接口和抽象类有什么区别

...4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普 查看详情

抽象类和只有受保护构造函数的类有啥区别? (。网)

】抽象类和只有受保护构造函数的类有啥区别?(。网)【英文标题】:What\'sthedifferencebetweenanabstractclass,andaclasswithonlyprotectedconstructors?(.NET)抽象类和只有受保护构造函数的类有什么区别?(。网)【发布时间】:2011-01-1316:07:27... 查看详情

接口和抽象类有什么区别

...现4.接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量5.抽象类历的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽 查看详情

接口和抽象类有什么区别

接口和抽象类有什么区别你选择使用接口和抽象类的依据是什么?接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人... 查看详情

接口和抽象类有什么区别?

接口和抽象类有什么区别你选择使用接口和抽象类的依据是什么?接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人... 查看详情

不明白java中的泛型和抽象类有啥区别,感觉他们作用一样啊,为啥要用2种方法呢

参考技术A泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。其实泛型正体现了java的多态性抽象类是一个类只能被继承。如果一个类里包含了一个或多个抽象方法,类就必须... 查看详情

接口和抽象类有什么区别(代码片段)

接口和抽象类有什么区别你选择使用接口和抽象类的依据是什么?接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人... 查看详情

接口和抽象类有什么区别

https://www.cnblogs.com/yongjiapei/p/5494894.htmlhttp://blog.csdn.net/chengqiuming/article/details/70139323 查看详情

接口和抽象类有什么区别

 你选择使用接口和抽象类的依据是什么?接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(... 查看详情

接口和抽象类有什么区别

你选择使用接口和抽象类的依据是什么?接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果... 查看详情

java8中的抽象类和接口到底有啥区别?

...官问抽象类和接口的区别是什么,大部人肯定会说:接口中的所有方法都是抽象的,抽象类中的方法除了抽象方法还可以写实现方法,如果你还这样回答那你就OUT啦,要跟上形式。这个问题我在面试一个39岁的程序员时,他居然... 查看详情