Fork me on GitHub

extends和implement的区别

本文首发于我的个人Blog阿西BUG,欢迎大家批评指正


前言

最近在学习pureMVC,发现其中不少类继承的时候会写成形如export default class AppFacade extends puremvc.Facade implements puremvc.IFacade {...}的样子;最初我的理解中,extendsimplement都是继承的意思,但是又一想,都是继承完全可以写成export default class AppFacade extends puremvc.Facade puremvc.IFacade {...}
那么问题来了,extends和implement的区别是什么呢?


假设

假如我有一个干净的抽象类A

1
2
3
abstract class A {
abstract m(): void;
}

在继承(extends)方面,就像C#或者java里面那样,我可以像下面这样来继承这个抽象类:

1
2
3
4
//TypeScript
class B extends A{

}

但是在实现方面(implement),在TypeScript中也可以去implement一个类:

1
2
3
class C implements A {
m(): void { }
}

那么问题来了:类B和类C在行为上有什么不同?我该如何选择?


解答

implements关键字将类A当作一个接口,这意味着类C必须去实现定义在A中的所有方法,无论这些方法是否在类A中有没有默认的实现。同时,也不用在类C中定义super方法。
而就像是extends关键字本身所表达的意思一样,你只需要实现类A中定义的虚方法,并且关于super的调用也会有效。
我想在抽象方法的情况下,这并没有什么区别。但是很少有只使用抽象方法的类,如果只使用抽象方法,最好将其转换为接口。

回到前言中的例子,Facade是一个基类,IFacade是基于Facade扩展出来的一个接口类,那么此时AppFacade具有Facade的属性,同时又必须实现IFacade中定义的方法。

—end—
Enjoy it ? Donate for it ! 欣赏此文?求鼓励,求支持!
>