# 类与接口
之前说过,接口(Interfaces)可以用于对「对象的形状(Shape)」进行描述。
这一章主要介绍接口的另一个用途,对类的一部分行为进行抽象
# 类实现接口
类实现(implements)是面向对象中的一个重要概念。
一般来讲,一个类只能继承自另一个类,有时候不同类之间可以有一些共有的特性,这时候就可以把特性提取成接口(interfaces),用 implements 关键字来实现。这个特性大大提高了面向对象的灵活性。
举例来说,门是一个类,防盗门是门的子类。防盗门有一个报警器的功能,另一个类,车,也有报警器的功能。此时我们可以考虑把报警器提取出来,作为一个接口,防盗门和车都去实现它。
interface Alarm {
alert(): void;
}
class Door {}
// 防盗门 继承 门 实现 报警
class SecurityDoor extends Door implements Alarm {
alert() {
console.log("SecurityDoor alert");
}
}
// 车 实现 报警
class Car implements Alarm {
alert() {
console.log("Car alert");
}
}
# 接口继承接口
和类一样,接口也可以相互继承。 这让我们能够从一个接口里复制成员到另一个接口里,可以更灵活地将接口分割到可重用的模块里。
interface Alarm {
alert(): void;
}
interface LightableAlarm extends Alarm {
lightOn(): void;
lightOff(): void;
}
这很好理解,LightableAlarm
继承了 Alarm
,除了拥有 alert
方法之外,还拥有两个新方法 lightOn
和 lightOff
# 接口继承类
常见的面向对象语言中,接口是不能继承类的,但是在 TypeScript 中却是可以的:
class Point {
x: number;
y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
interface Point3d extends Point {
z: number;
}
let point3d: Point3d = { x: 1, y: 2, z: 3 };
因为当我们在声明 class Point
时,也同时创建了一个名为 Point
的类型。上面的例子等价于:
class Point {
x: number;
y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
interface PointInstanceType {
x: number;
y: number;
}
interface Point3d extends PointInstanceType {
z: number;
}
let point3d: Point3d = { x: 1, y: 2, z: 3 };