接口和抽象类的区别(JS)

3

抽象类的局限性在于子类只能扩展一个抽象类。因此,多重继承可以在接口中找到。

接口可以像抽象类一样拥有具体方法,但不能有实例字段,只能有公共、静态、最终字段。

当我得出结论时,唯一的区别在于接口根本不能有实例字段,这个说法正确吗?


1
你说的是哪种编程语言? - undefined
1
JavaScript,抱歉。 - undefined
3
我之前没想到 JavaScript 有接口的概念。 - undefined
他们确实有 @Jay - undefined
3
JavaScript 中没有“接口”和“抽象类”。你是在谈论 TypeScript 吗? - undefined
3个回答

2

接口仅描述应该实现哪些属性和方法,并且不描述方法的工作方式。

但是抽象类可以描述方法的工作方式,就像普通类一样。例如:

abstract class MyClass {
   abstract method_1() // a method with no implementation

   method_2() { // a method with implementation
      // do something
   }
}

接口看起来像:

interface MyInterface {
   method_1(): void;
   method_2(): string;
}

2
你可以在接口中的方法前面写上"default"来使其成为抽象方法。 - undefined
1
这不是JavaScript吗? - undefined
1
@Bergi 这是TypeScript。 - undefined

1
我假设你的问题涉及到Typescript,因为"interface"和"abstract"声明只能在Typescript中使用。
你的结论是正确的,但它们之间不止有一个区别:
  • 一个接口只能有抽象方法,而抽象类可以有抽象和非抽象方法
  • 一个接口只能有公共成员,而抽象类可以有受保护和公共成员
  • 抽象类可以提供接口的实现,接口不能提供抽象类的实现
如果你想深入了解这个主题的设计方面(仍然与接口和抽象类有关),我建议使用"组合优于继承"原则。
这里:Prefer composition over inheritance? 这里:https://en.wikipedia.org/wiki/Composition_over_inheritance

1

interface通常是某种类型声明,而classabstract classclass声明,在JS中只是构造函数,尽管它们经常定义特定的值“类型”。abstract是两者之间的一种特殊情况,因为它们定义了一个新的具体值(在JS中是构造函数),但不能在不被子类化的情况下实例化。

总之,interfaces是在类型空间中的声明,而[abstract] class是在值空间中的声明。例如,在TypeScript中,您可以使用class implements将两者桥接起来。在JavaScript中,术语“interface”更常用于描述某些API返回的特定类型值的行为的一般形状(请参见https://developer.mozilla.org/en-US/docs/Web/API/Event,其中术语interface用于描述不同类型的事件)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接