赞
踩
抽象类:抽象类是无法实例化的特殊类。所以问题是为什么我们需要一个不能被实例化的类,抽象类只能是子类(继承自)。换句话说,它只允许其他类继承它,但不能实例化。优点是它为所有子类执行特定的层次结构。简而言之,它是一种契约,它强制所有子类执行相同的层次或标准。
接口:接口不是类,由Interface关键词定义,接口只有方法签名,没有方法实现(8之后支持默认方法)。与抽象类类似,它也是一种契约,用于定义所有子类的层次结构,或者它定义了特定的方法集和它们的参数。它们之间的主要区别是,一个类可以实现多个接口,但只能继承一个抽象类。
属性 | 接口 | 抽象类 |
---|---|---|
多继承 | 一个类可以实现多个接口 | 一个类只能继承一个抽象类 |
默认实现 | 接口只包含接口签名 | 抽象类可以提供默认实现,子类可以重载抽象类方法 |
访问修饰符 | 接口默认所有的方法均为public | 抽象类可以包含protected修饰符 |
内在 vs 外在 | 接口用以定义类具备的外在能力特征,比如人和车辆都具备可移动的特性,因此他们均可以继承实现IMovable接口。 | 抽象类定义的是类所具备的内在特征,如果应用场景需要定义同一类型的对象,最好使用抽象。 |
同质性 | 如果应用场景是同一方法的不同实现,那么最好是使用接口 | 如果不同的方法实现需要共享同样的行为或者状态(参考上一章的装饰器模式实例),那么抽象类是首选 |
速度 | 因为编译器需要确定方法实现类,所以,相对于抽象类,接口通常耗时会更长。 | |
重构代价:功能升级 | 如果我们需要为接口新增一个签名方法,那么我们必须对应修改所有接口实现类,并且为新方法指定方法实现。 | 如果我们需要为抽象类新增方法,我们可以仅在抽象类中指定默认实现,而无须修改所有实现类。 |
属性与常量 | 接口中不允许定义任何属性 | 抽象类中允许定义属性和常量 |
https://www.codeproject.com/articles/11155/abstract-class-versus-interface
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。