单根结构

在面向对象的程序设计中,由于C++的引入而显得尤为突出的一个问题是:所有类最终是否都应从单独一个 基础类继承。在Java 中(与其他几乎所有OOP语言一样),对这个问题的答案都是肯定的,而且这个终级基 础类的名字很简单,就是一个“Object”。这种“单根结构”具有许多方面的优点。 单根结构中的所有对象都有一个通用接口,所以它们最终都属于相同的类型。另一种方案(就象 C++那样) 是我们不能保证所有东西都属于相同的基本类型。从向后兼容的角度看,这一方案可与C 模型更好地配合, 而且可以认为它的限制更少一些。但假期我们想进行纯粹的面向对象编程,那么必须构建自己的结构,以期 获得与内建到其他 OOP 语言里的同样的便利。需添加我们要用到的各种新类库,还要使用另一些不兼容的接 口。理所当然地,这也需要付出额外的精力使新接口与自己的设计方案配合(可能还需要多重继承)。为得 到C++额外的“灵活性”,付出这样的代价值得吗?当然,如果真的需要——如果早已是 C 专家,如果对C 有难舍的情结——那么就真的很值得。但假如你是一名新手,首次接触这类设计,象Java 那样的替换方案也 许会更省事一些。 单根结构中的所有对象(比如所有 Java 对象)都可以保证拥有一些特定的功能。在自己的系统中,我们知道 对每个对象都能进行一些基本操作。一个单根结构,加上所有对象都在内存堆中创建,可以极大简化参数的 传递(这在 C++里是一个复杂的概念)。 利用单根结构,我们可以更方便地实现一个垃圾收集器。与此有关的必要支持可安装于基础类中,而垃圾收 集器可将适当的消息发给系统内的任何对象。如果没有这种单根结构,而且系统通过一个句柄来操纵对象, 那么实现垃圾收集器的途径会有很大的不同,而且会面临许多障碍。 由于运行期的类型信息肯定存在于所有对象中,所以永远不会遇到判断不出一个对象的类型的情况。这对系
35
统级的操作来说显得特别重要,比如违例控制;而且也能在程序设计时获得更大的灵活性。 但大家也可能产生疑问,既然你把好处说得这么天花乱坠,为什么C++没有采用单根结构呢?事实上,这是 早期在效率与控制上权衡的一种结果。单根结构会带来程序设计上的一些限制。而且更重要的是,它加大了 新程序与原有C 代码兼容的难度。尽管这些限制仅在特定的场合会真的造成问题,但为了获得最大的灵活程 度,C++最终决定放弃采用单根结构这一做法。而 Java 不存在上述的问题,它是全新设计的一种语言,不必 与现有的语言保持所谓的“向后兼容”。所以很自然地,与其他大多数面向对象的程序设计语言一样,单根 结构在 Java 的设计方案中很快就落实下来。

 

 1 package Com.TomTest;
 2 
 3 
 4 abstract class As {
 5        abstract  int min(int x,int y);
 6        int max(int x,int y) {
 7           return x>y?x:y;
 8        }
 9     }
10     class B extends As {
11        int min(int x,int y) {
12           return x<y?x:y;
13        }
14     }
15     public class TomTest_28 {
16        public static void main(String args[]) {
17          As a;
18          B b=new B();
19          int max=b.max(12,34);
20          int min=b.min(12,34);
21          System.out.println("max="+max+" min="+min);
22          a=b;        
23          max=a.max(12,34);
24          System.out.println("max="+max);
25        }
26     }

 

posted @ 2018-08-07 17:58  borter  阅读(198)  评论(0编辑  收藏  举报