接口(interface)除了是对对象形状的描述,也是对类(class)的抽象。具体来说就是,将不同类之间**共有的特性提取成接口,用implements关键字来实现**。
用*** 类实现接口 ***,提高了面向对象的灵活性。
类实现接口 => class Test implements InterfaceTest
举例来说,门是一个类,防盗门是门的子类。如果防盗门有一个报警器的功能,我们可以简单的给防盗门添加一个报警方法。这时候如果有另一个类,车,也有报警器的功能,就可以考虑把报警器提取出来,作为一个接口,防盗门和车都去实现它.
一个类可以实现多个接口 => 就好比车既可以有报警器也可以有开关灯的功能,这些功能都是一个个的接口
接口继承接口
接口继承接口=> 就好比报警器还可以再升级为具有开关灯等功能的报警器:
接口继承类
这个的理解就有点叼了!在常规的面向对象语言中,接口是不能继承类的,但在ts中却可以。
** why?**
因为在声明 class Point 时,除了会创建一个名为 Point 的类之外,同时也创建了一个名为 Point 的**类型**(创建的实例的类型)
等价于:
当我们声明 interface Point3d extends Point 时,Point3d 继承的实际上是类 Point 的实例的类型。可以理解为定义了一个接口 Point3d 继承另一个接口 PointInstanceType。
所以「接口继承类」和「接口继承接口」没有什么本质的区别。
同时应注意:声明 Point 类时创建的 Point 类型只包含其中的实例属性和实例方法
class Point {
/** 静态属性,坐标系原点 */
static origin = new Point(0, 0);
/** 静态方法,计算与原点距离 */
static distanceToOrigin(p: Point) {
return Math.sqrt(p.x * p.x + p.y * p.y);
}
/** 实例属性,x 轴的值 */
x: number;
/** 实例属性,y 轴的值 */
y: number;
/** 构造函数 */
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
/** 实例方法,打印此点 */
printPoint() {
console.log(this.x, this.y);
}
}
interface PointInstanceType {
x: number;
y: number;
printPoint(): void;
}
let p1: Point;
let p2: PointInstanceType;
此处最后的类型 Point 和类型 PointInstanceType 是**等价**的