JAVA在设计接口和类的规则时,有一个明确的规定。JAVA不支持类(实现)的多重继承,但支持接口(定义)的多重继承。
我已经无从了解这个设计的初衷,但这样的规定隐含了以下的意义。
接口是设计的产物,即在需求设计时定义的对软件功能的定义。而类是实现的产物,它是在实现过程中根据实现的具体情况而完成的。如果用代码来说明就是:
在设计时我需要我设计的“模块”提供两个功能:
1.提供两个整数相加的功能。
2.提供两个字符串连接的功能。
我是一个伟大的设计师,为了不影响我的整体思路,我不会在这时停下来去实现它,所以我需要一个类似伪代码的东西来记录我的实现思路。java说,好,我们为你提供一个叫接口的东西,你只写下你要实现的东西不用提供具体实现方法。
。。。。。。。其它设计。
好了,哪个小匪来领实现这个任务?
小匪甲领取了这个编码任务。分析大当家的设计思想,啊这个好办。
checkedConcat我还想被别的地方调用,所以我不想设计成ptivate的。所以我设计的MyModuleImp从外面可以看到三个方法。
大当家的叫我提供两个方法,而我的实现有三个方法,幸亏有接口啊,我发布这个模块时只提供接口的文档。这样你在智能感应的IDE中一打开这个接口看到的只是大当家定义的两个方法。
所以:接口可以只将设计意图的方法暴露给调用者。
那么,当我一个类提供了不同功能的方法时,我想在不同时候只显示某类功能的方法,怎么办?
其实这个问题Sun的代码中都没有很好地处理。比如我的一个类提供了对象的初始化方法和对象释放的方法,整数运算的方法和字符串运算方法以及图形运算方法。当然这只是举例。
有人说这个类设计不合理,这么多不同类型的功能应该在不同类中实现。
说得对!但是..........
如果我们的对象是本地生成的,多次new多个对象成本不是太高,如果我们的对象是从远程调用的,那么多个对象的生成成本就很高了。
另外任何对象自身管理的方法和业务方法不能分到两个类中实现吧?一个只有自身管理的方法的类除了自恋还有什么用?而有些必须要被始化和释放等管理的对象只有业务方法它也工作不起来,所以至少有两类功能要在同一类中完成。假如它们的重载方法足够多时,你会看到它们是很多功能的方法按字母排序混合在一起。
典型的就是URLConnection类,你打开它时,设置请求参数的方法,获取响应头域的方法,获取输入输出的方法一大堆。不过还好是它们的命名方式使很多功能相同的方法能排在一起。
如何有效的组织一个实现的不同功能的方法的分类?我们可以通过多接口来完成。
这个思想早在COM时代就已经采用了,无论你获取的是IUnKnown接口还是IDispatch接口还是业务接口,其实反回的都是同一个CoClass对象,但你获取不同接口看到的是不同功能的函数。同时你只要实例化一次,获取到任何接口就可以从这一接口生成其它接口,这对于调用者是非常有意义的,我不仅能得到不同功能的函数分类,而且不需要多次实例化多个对象。
OK!
IObjManager om = new MyModuleImp(); //或getObjFromNet如果我们把生成实例的方法统一封装起来,以及对象的生命周期管理都规定在一个类似IUnknown的接口中,我们就可以把多功能的不同类有一个统一的管理行为,就象远程EJB对象的实例化。
om. 这时我们看到的只是IObjManager接口的方法,我们可以init.destory.
当我们需要它的业务方法时:
IMath m = (IMath)om; //相当于QueryInterface
m. 这时我们看到的只是math相关的功能方法。
另外当我们想增加一个方法并保留原有方法时只需在新的接口中声明,并让实现类继承自这个接口(其实就是在implements关键字后面加上接口名称)。这样新旧接口可以并存使用,既不影响以前的代码,也不影响后来的人使用新接口:
这样原来使用IMath来计算“加和乘“的代码根本不受影响,而新的程序可以使用IMathEx来计算“加,乘和开方”运算。
所以多接口不仅使我们能够有效的组织不同功能的代码,而且可以使对象具有统一的管理方法,同时避免多次生成对象带来的开销。
分享到:
相关推荐
界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活 ...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...
Java的线程工具易于使用,并且像Java中的其他东西一样可以在不同的平台之间移植。这是一件好事,因为如果没有线程,那么除了最简单的applet之外,几乎不可能编写出任何程序。如果你想使用Java,就必须学习线程。 ...
1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与...
1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与...
1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与...
Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...
在Java中创建和使用定时器的一个小例子代码,绘制数字的Canvas对象,设置当前的绘图对象,设置定时器的运行时间,并包括了生成随机数的For循环,考察了多个Java技巧的编程,不仅仅是定时器的使用。
6.2.3 使用点操作符的技巧 148 6.2.4 类的数组 149 6.3 小结:Java其实是个类和对象的世界 152 6.4 习题 153 第7章 Java中的方法——给汽车丰富多彩的功能 154 教学视频:2小时55分钟 7.1 方法:让汽车动开动 ...
1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与...
使用集合的技巧 83 Collections--集合工具类 83 Arrays—数组对象工具类 84 增强for循环 85 可变参数(...) 86 枚举:关键字 enum 86 自动拆装箱 86 泛型 87 <java.lang>System 89 <java.lang>Runtime 90 <java....
java为数据结构中的列表定义了一个接口类java.util.list同时提供了3个实现类,分别是ArrayList、Vector、LinkedList使用; 生成不重复的随机数序列;列表、集合与数组的互相转换;java为数据结构中的映射定义一个接口...
1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与...
学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据...