抽象类和接口都是为了达到多型(Polymorphism)这个设计模式所使用的手段。
两者皆不能直接的被使用“实例化”。
当设计中的子类皆具有相同函数(function),可以采用抽象类的方式,使得子类得以继承来节省代码数,也能达到修改父类就能同时影响子类的特性。
之所以采用抽象类,即表示子类都必须要具有同名,但不同实作的方法(method),以抽象类的特性来强迫子类必须自行实作,这是和一般父类使用时机上的区别。
若是子类都必须继承于其它父类,但又必须具有特定方法(method),会采用接口的方式来进行。或是在发展之中,使用接口来加快建构的速度,因为不用替每个函数写代码,可以先专注在某一个类的实作,也能因此通过编译检查。
两者皆是为了多形而使用到的技巧,接口只定义必要的方法,而不管这个方法是由自行实作或是继承而来。因此既使使用了接口,仍然可以经由继承其它类来达到和抽象类相同的效果。
至于单继承,个人不觉得是一种“缺陷”,而是为了避免多继承可能乱象所必须付出的代价。所以在 Java 里会使用聚合的方式(将其它类的实例作为属性,代为呼叫)来达到相同的目的。