抽象类的局限性在于子类只能扩展一个抽象类。因此,多重继承可以在接口中找到。
接口可以像抽象类一样拥有具体方法,但不能有实例字段,只能有公共、静态、最终字段。
当我得出结论时,唯一的区别在于接口根本不能有实例字段,这个说法正确吗?
抽象类的局限性在于子类只能扩展一个抽象类。因此,多重继承可以在接口中找到。
接口可以像抽象类一样拥有具体方法,但不能有实例字段,只能有公共、静态、最终字段。
当我得出结论时,唯一的区别在于接口根本不能有实例字段,这个说法正确吗?
接口仅描述应该实现哪些属性和方法,并且不描述方法的工作方式。
但是抽象类可以描述方法的工作方式,就像普通类一样。例如:
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;
}
interface
通常是某种类型声明,而class
或abstract class
是class
声明,在JS中只是构造函数,尽管它们经常定义特定的值“类型”。abstract
是两者之间的一种特殊情况,因为它们定义了一个新的具体值(在JS中是构造函数),但不能在不被子类化的情况下实例化。
总之,interfaces
是在类型空间中的声明,而[abstract] class
是在值空间中的声明。例如,在TypeScript中,您可以使用class implements
将两者桥接起来。在JavaScript中,术语“interface”更常用于描述某些API返回的特定类型值的行为的一般形状(请参见https://developer.mozilla.org/en-US/docs/Web/API/Event,其中术语interface
用于描述不同类型的事件)。