知识大全 选择Java接口还是抽象类
Posted 知
篇首语:常识是我所知道的最高的通情达理。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 选择Java接口还是抽象类相关的知识,希望对你有一定的参考价值。
选择Java接口还是抽象类 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
选择Java接口还是抽象类 作者 俞良松 本文选自 开放系统世界-赛迪网 年 月 日 很多人有过这样的疑问 为什么有的地方必须使用接口而不是抽象类 而在另一些地方 又必须使用抽象类而不是接口呢?或者说 在考虑Java类的一般化问题时 很多人会在接口和抽象类之间犹豫不决 甚至随便选择一种 实际上接口和抽象类的选择不是随心所欲的 要理解接口和抽象类的选择原则 有两个概念很重要 对象的行为和对象的实现 如果一个实体可以有多种实现方式 则在设计实体行为的描述方式时 应当达到这样一个目标 在使用实体的时候 无需详细了解实体行为的实现方式 也就是说 要把对象的行为和对象的实现分离开来 既然Java的接口和抽象类都可以定义不提供具体实现的方法 在分离对象的行为和对象的实现时 到底应该使用接口还是使用抽象类呢? 通过抽象类建立行为模型 在接口和抽象类的选择上 必须遵守这样一个原则 行为模型应该总是通过接口而不是抽象类定义 为了说明其原因 下面试着通过抽象类建立行为模型 看看会出现什么问题 假设要为销售部门设计一个软件 这个软件包含一个 发动机 (Motor)实体 显然无法在发动机对象中详细地描述发动机的方方面面 只能描述某些对当前软件来说重要的特征 至于发动机的哪些特征是重要的 则要与用户(销售部门)交流才能确定 销售部门的人要求每一个发动机都有一个称为马力的参数 对于他们来说 这是惟一值得关心的参数 基于这一判断 可以把发动机的行为定义为以下行为 行为 查询发动机的马力 发动机将返回一个表示马力的整数 虽然现在还不清楚发动机如何取得马力这个参数 但可以肯定发动机一定支持这个行为 而且这是所有发动机惟一值得关注的行为特征 这个行为特征既可以用接口定义 也可以用抽象类定义 为了说明用抽象类定义可能出现的问题 下面用抽象类建立发动机的行为模型 并用Java方法描述行为 代码如下 public abstract Motor abstract public int getHorsepower(); 在Motor抽象类的基础上构造出多种具体实现 例如A型发动机 B型发动机等 再加上系统的其它部分 最后得到 版的软件并交付使用 一段时间过去了 现在要设计 版的软件 在评估 版软件需求的过程中 发现一小部分发动机是电池驱动的 而电池需要一定的充电时间 销售部门的人希望能够通过计算机查阅充电时间 根据这一要求定义一个新的行为 如图 所示 行为 查询电驱动发动机的充电时间 发动机将返回一个表示充电时间的整数 用Java方法来描述这个行为 代码如下 public abstract BatteryPoweredMotor extends Motor abstract public int getTimeToRecharge(); 在销售部门的软件中 电驱动发动机也以类的形式实现 但这些类从BatteryPoweredMotor而不是Motor派生 这些改动加入到 版软件之后 销售部门很满意 随着业务的不断发展 不久之后光驱动的发动机出现了 销售部门要求光驱动发动机需要一定光能才能运转 光能以流明(Lumen)度量 这个信息对客户很重要 因为下雨或多云的天气里 某些光驱动发动机可能无法运转 销售部门要求为软件增加对光驱动发动机的支持 所以要定义一个新的行为 行为 查询光驱动发动机能够正常运转所需要的最小流明数 发动机返回一个整数 再定义一个抽象类并把行为 转换成Java方法 代码如下 public abstract SolarPoweredMotor extends Motor abstract public int getLumensToOperate(); 选择Java接口还是抽象类 作者 俞良松 本文选自 开放系统世界-赛迪网 年 月 日 很多人有过这样的疑问 为什么有的地方必须使用接口而不是抽象类 而在另一些地方 又必须使用抽象类而不是接口呢?或者说 在考虑Java类的一般化问题时 很多人会在接口和抽象类之间犹豫不决 甚至随便选择一种 实际上接口和抽象类的选择不是随心所欲的 要理解接口和抽象类的选择原则 有两个概念很重要 对象的行为和对象的实现 如果一个实体可以有多种实现方式 则在设计实体行为的描述方式时 应当达到这样一个目标 在使用实体的时候 无需详细了解实体行为的实现方式 也就是说 要把对象的行为和对象的实现分离开来 既然Java的接口和抽象类都可以定义不提供具体实现的方法 在分离对象的行为和对象的实现时 到底应该使用接口还是使用抽象类呢? 通过抽象类建立行为模型 在接口和抽象类的选择上 必须遵守这样一个原则 行为模型应该总是通过接口而不是抽象类定义 为了说明其原因 下面试着通过抽象类建立行为模型 看看会出现什么问题 假设要为销售部门设计一个软件 这个软件包含一个 发动机 (Motor)实体 显然无法在发动机对象中详细地描述发动机的方方面面 只能描述某些对当前软件来说重要的特征 至于发动机的哪些特征是重要的 则要与用户(销售部门)交流才能确定 销售部门的人要求每一个发动机都有一个称为马力的参数 对于他们来说 这是惟一值得关心的参数 基于这一判断 可以把发动机的行为定义为以下行为 行为 查询发动机的马力 发动机将返回一个表示马力的整数 虽然现在还不清楚发动机如何取得马力这个参数 但可以肯定发动机一定支持这个行为 而且这是所有发动机惟一值得关注的行为特征 这个行为特征既可以用接口定义 也可以用抽象类定义 为了说明用抽象类定义可能出现的问题 下面用抽象类建立发动机的行为模型 并用Java方法描述行为 代码如下 public abstract Motor abstract public int getHorsepower(); 在Motor抽象类的基础上构造出多种具体实现 例如A型发动机 B型发动机等 再加上系统的其它部分 最后得到 版的软件并交付使用 一段时间过去了 现在要设计 版的软件 在评估 版软件需求的过程中 发现一小部分发动机是电池驱动的 而电池需要一定的充电时间 销售部门的人希望能够通过计算机查阅充电时间 根据这一要求定义一个新的行为 如图 所示 行为 查询电驱动发动机的充电时间 发动机将返回一个表示充电时间的整数 用Java方法来描述这个行为 代码如下 public abstract BatteryPoweredMotor extends Motor abstract public int getTimeToRecharge(); 在销售部门的软件中 电驱动发动机也以类的形式实现 但这些类从BatteryPoweredMotor而不是Motor派生 这些改动加入到 版软件之后 销售部门很满意 随着业务的不断发展 不久之后光驱动的发动机出现了 销售部门要求光驱动发动机需要一定光能才能运转 光能以流明(Lumen)度量 这个信息对客户很重要 因为下雨或多云的天气里 某些光驱动发动机可能无法运转 销售部门要求为软件增加对光驱动发动机的支持 所以要定义一个新的行为 行为 查询光驱动发动机能够正常运转所需要的最小流明数 发动机返回一个整数 再定义一个抽象类并把行为 转换成Java方法 代码如下 public abstract SolarPoweredMotor extends Motor abstract public int getLumensToOperate(); 如图 所示 SolarPoweredMotor和BatteryPoweredMotor都从Motor抽象类派生 在整个软件中 %以上的代码以相同的方式对待所有的发动机 偶尔需要检查一下发动机是光驱动还是电驱动 使用instanceof实现 代码如下 [color=# ] if (instanceof SolarPoweredMotor) if (instanceof BatteryPoweredMotor) 无论是哪种发动机 马力这个参数都很重要 所以在所有派生的抽象类(SolarPoweredMotor和BatteryPoweredMotor)中 getHorsepower()方法都有效 现在销售部门又有了一种新的发动机 它是一种既有电驱动又有光驱动的双重驱动发动机 光驱动和电驱动的行为本身没有变化 但新的发动机同时支持两种行为 在考虑如何定义新型的光电驱动发动机时 接口和抽象类的差别开始显示出来了 新的目标是在增加新型发动机的前提下尽量少改动代码 因为与光驱动发动机 电驱动发动机有关的代码已经过全面的测试 不存在已知的Bug 为了增加光电驱动发动机 要定义一个新的SolarBatteryPowered抽象类 如果让SolarBatteryPowered从Motor抽象类派生 SolarBatteryPowered将不支持针对光驱动发动机和电驱动发动机的instanceof操作 也就是说 如果查询一个光电驱动的发动机是光驱动的 还是电驱动的 得到的答案是 都不是 如果让SolarBatteryPowered从SolarPoweredMotor(或BatteryPoweredMotor)抽象类派生 类似的问题也会出现 SolarBatteryPowered将不支持针 cha138/Article/program/Java/hx/201311/26371相关参考
Java抽象类和接口的比较 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &
知识大全 抽象类(abstract class)和接口(interface)
java中的abstractclass和interface abstractclass和interface是Java语言中对于抽象类定义进行支持的两种机制正是由于这两种机制的存在才赋予了Java
本篇文章是对php中抽象类和接口的概念以及区别进行了详细的分析介绍需要的朋友参考下 复制代码代码如下://抽象类的定义abstractclassku//定义一个抽象类abstractfunc
C#接口和抽象类技术特点浅析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一C#抽象类 C#
C#中抽象类和接口的区别与使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一抽象类 抽象类
MSDN抽象类是从子类发现了公共的东西泛化(也可以说把公共的东西单独提取出来)出父类然后子类继承父类而接口是根本不知道子类的存在方法如何实现还不确定预先定义的 有一个人他叫王麻子那年他生了个儿子
作者Allen 抽象方法是必须实现的方法就象动物都要呼吸但是鱼用鳃呼吸猪用肺呼吸 动物类要有呼吸方法怎么呼吸就是子类的事了 现在有很多讨论和建议提倡用interface代替abstra
接口interface 初期理解可以认为是一个特殊的抽象类 当抽象类中的方法都是抽象的那么该类可以通过接口的形式来表示 class用于定义类 interface用于定义接口接口定义时格式特点
抽象工厂(AbstractFactory)模式意图:为特定的客户(或情况)提供特定系列的对象 类的适配器(Adapter)模式意图:将一个类的接口转换成客户希望的另外一个接口 对象的适配器(A
在我们所有乐器(Instrument)例子中基础类Instrument内的方法都肯定是伪方法若去调用这些方法就会出现错误那是由于Instrument的意图是为从它衍生出去的所有类都创建一个通用接口