在我学习java语言的过程中,一直认为抽象类和接口是表现一种抽象的两种表达形式而已,它们只是形式的不同,而到现在,不仅从语言本身还是设计的角度,抽象类和接口都有非常不同的概念和意图。
从语言本身角度上考虑,众所周知,抽象类是可以包含一系列公共的状态和行为。也就是说,如果一系列类如果有很多公共的状态和方法,就可以把它们放在抽象类中,而接口只是一系列没有方法体的方法的集合。另外,抽象类可以继承抽象类,抽象类可以实现接口,而接口只能继承接口。这些都非常简单,都是面向对象语言中的一些基本概念。 下面我将说一下在设计中抽象类和接口的区别。 从设计的角度上来说,抽象类和接口两概念本身关注的方面就不同。抽象类可以看成是一种聚集相关实体的方式,其关注点是如何设计这些聚集的相关实体(派生类),从而可以以同样的方式使用它们。而接口的关注点式要使用这些派生/实现的对象,也就是说接口要有什么样的功能方法,才能更好的服务于控制对象。通俗一点讲就是借口关注的是上层调用,而抽象类关注的是下层实现。这样就注定了在面向对象的概念和规约层次所产生的都是接口,因为只有接口关注的是调用,是服务调用方。 但是不是在设计中,接口就一定优于抽象类,不如: 1. 如果相关实体中有很多默认的状态和行为,这样如果只用接口的话在实现类中就会出现很多冗余,非常不好。 2.在上面的情况可以考虑用抽象类实现接口的设计方式。 但是要注意的一点是,java和as中,任何类只能有一次继承机会,所以,不到万不得已,我们还是别用抽象类。 可惜的是as语言中没有抽象类的概念,估计是认为抽象类不重要吧,不过我相信,在未来的flash/flex版本中,一定会出现抽象类的,我赌adobe一定会支持的,嘿嘿。 |