Appearance
一、相同点
都可以被类实现(
implements
)都可以定义规范(属性、方法结构)
都不能直接实例化(抽象类本身不能实例化)
二、主要区别
interface | abstract class | |
---|---|---|
本质 | 纯定义规范(只有类型) | 既可以定义规范也可以提供默认实现 |
关键字 | interface | abstract class |
是否有实现 | ❌ 只能定义结构,不能写实现逻辑 | ✅ 可以写部分方法的具体实现 |
多继承 | ✅ 支持实现多个接口 | ❌ 只能单继承 |
编译后 | 只存在于编译阶段,JavaScript中没有interface概念 | 转成真实的JS类存在 |
属性修饰符 | ❌ 不支持(readonly除外) | ✅ 支持(public / protected / private ) |
使用场景 | 设计标准、约束结构(更轻量) | 需要部分默认行为或统一基类逻辑 |
三、示例对比
interface
示例
ts
interface Animal {
name: string
move(): void
}
class Dog implements Animal {
name = 'dog'
move() {
console.log('Running')
}
}
abstract class
示例
ts
abstract class Animal {
name: string
constructor(name: string) {
this.name = name
}
abstract move(): void
sayHello() {
console.log(`Hello, I am ${this.name}`)
}
}
class Dog extends Animal {
move() {
console.log('Running')
}
}
四、总结一句话
🔥
interface
定义规范,abstract class
定义规范 + 部分实现。