设为首页 加入收藏

TOP

OOP语言技术比较:Java,C++,Object Pascal(四)
2014-11-24 01:15:22 来源: 作者: 【 】 浏览:25
Tags:OOP 语言 技术 比较 Java Object Pascal
或dynamic引入(这两个关键字的区别仅在于技术实现的不同)。在派生类重新定义方法时,应使用override关键字(这样就强迫编译器检查方法声明是否匹配)。这是OP中特有的,它允许在基类做更多的改动。


·Java:在Java中,所有的方法都使用后期绑定,除非你使用final关键字。final方法不能被重新定义,在调用速度上更快。在Java中正确的方法名称对于多态性的实现是非常重要的。Java中默认后期绑定和C++中默认前期绑定这一事实表明了这两种语言不同的针对性:C++有时会牺牲OOP模型以获取性能的提升。


·注意:构造函数和析构函数的后期绑定。与其它两种语言相反,Object Pascal允许定义虚拟构造函数。而这三种语言都支持虚拟析构函数。


抽象方法和抽象类
·特性描述:当建立一个复杂的继承链时,为了实现多态性,经常需要为更高级的类引入一些方法,虽然这些方法未必是为这个类抽象概念而定义的。除了使用空方法定义,许多OOP语言实现了一种特殊的机制:定义抽象方法。所谓抽象方法就是没有实现的方法。具有一个或多个抽象方法的类称为抽象类。


·C++:在C++中,抽象方法被称为纯虚函数,通过在方法定义后添加所谓虚定义符(=0)可以获得一个抽象方法。抽象类就是具有(或继承了)一个或多个抽象方法的类。不能创建抽象类对象。


·OP:Object Pascal使用abstract关键字声明抽象方法。同样,抽象类就是具有或继承了抽象方法的类,但是你可以创建抽象类的实例(虽然编译器会产生一个警告信息)。这就隐含了调用抽象方法的危险,在运行期,这样会产生一个运行期错误,并会终止程序的运行。


·Java:在Java中,抽象方法和抽象类都用abstract关键字声明(事实上Java中的抽象类必须具有抽象方法,好像有一点多余)。同样,派生类如果没有重新定义所有的抽象方法,必须使用abstract关键字定义为抽象类。不能创建抽象类的实例。


多重继承和接口
·特性描述:一些OOP语言允许从多个基类派生新类。另一些语言只允许从一个类中派生新类,但是可以从多个接口(或者纯抽象类,只由纯虚函数构成的类)派生新类。


·C++:C++是三种语言中唯一支持多重继承的。一些程序员认为这是一件好事,另一些程序员认为这是一件坏事,我不想过多的讨论这个问题。多重继承产生了很多新概念,比如说虚基类,虽然功能强大,但并不好掌握。C++没有接口的概念,虽然它与多重继承的纯抽象类概念接近(接口可以看作多重继承的子集)。


·Java:Java,以及Object Pascal,都不支持多重继承,但是完全支持接口。接口的方法支持多态性,并且当需要一个接口对象时,可以通过一个对象实现接口。一个类只能继承自一个基类,但可以implement(关键字)多个接口。Java的接口与COM模型非常吻合,虽然没有预先的考虑。举个例子:


public interface CanFly {
public void Fly();
}
public class Bat extends Animal implements CanFly {
public void Fly( ) { // the bat flies… }
}


·OP:Delphi 3在Object Pascal中引入了类似Java的接口,这些接口非常吻合COM(虽然技术上经常在非COM程序中使用)。接口构造了一个与类独立的继承链,但是与Java一样,一个类可以继承自唯一的基类并实现多个接口。将类的方法映射为类实现的接口的方法是Object Pascal语言中令人迷惑的几个问题中的一个。


RTTI
·特性描述:在强类型OOP语言中,编译器完成所有类型检查的工作,所以很少需要运行程序保存类型的信息。然而,某些情况下需要某些类型信息。因此,这三种OOP语言都或多或少的支持运行期类型识别/信息(RTTI)。


·C++:最初的C++语言不支持RTTI。后来通过dynamic_cast的方式提供了部分的类型信息。你可以查询一个对象的类型,也可以检查两个对象是否具有相同的类型。


·OP:Object Pascal以及它的可视开发环境支持也需要大量的RTTI。不仅可以进行类型检查(使用is和as操作符),类也为它的published成员生成大量的RTTI。事实上这个关键字负责部分RTTI的生成。属性、流结构(窗体文件以及始于对象观察器的Delphi环境很大程度上依赖于类的RTTI。TObject类具有ClassName和ClassType方法。ClassType方法返回一个类类型变量——一个特殊类参考类型的实例(并不是类本身)。


·Java:和Object Pascal一样,Java中也有一个基类用于跟踪类型信息。Object类的getClass()方法会返回一个元类(一个用于描述类的类型的对象),你也可以使用getName()函数获得一个类名字符串。你还可以使用instanceof操作符。Java 1.0不支持更多内容的RTTI,但在未来的版本中可能会改变,以适应可视环境和组件的开发(所谓Java Beans)。


·例子:


// C++
Dog* MyDog = dynamic_cast (myAnimal);
// Java
Dog MyDog = (Dog) myAnimal;
// Object Pascal
Dog myDog := myAnimal as Dog;


异常处理
·特性描述:异常处理构想的出发点是简化程序的错误处理代码,提供标准内建机制,从而使程序更加健壮。异常处理的内容很多,这里我只是简述一些关键的要素和区别。


·C++:C++使用throw关键字来产生一个异常,用try关键字标志被保护的程序块,用catch关键字标志异常处理程序代码。异常是一些特殊类的对象,在这三种语言中都构成了各自的继承链。C++会对所有栈中的对象进行栈展开和销毁(调用析构函数)。


·OP:Object Pascal使用与C++类似的关键字raise,try和except,并且具有类似的功能。唯一真正的区别是因为没有对象会被创建于栈中,所以不会发生栈展开。另外,你可以使用一个finally关键字,标志那些无论是否产生异常都被执行的代码。在Delphi中,异常类全部派生自Exception。


·Java:Java使用和C++相同的关键字,但是其行为却更接近于Object Pascal,包括使用finally关键字。所有采用对象引用模型的语言基本都是如此。碎片回收程序的存在限制了finally关键字对类的应用,这些类不仅占用了内存资源。Java认为所有能产生异常的函数都具有一个正确的异常子句,这个子句告诉Java哪些异常可能会被产生。这个假设十分严格,并由编译器进行检查。这是一个非常有用的技术,即使这意味着程序员要做更多的工作。Java中的异常类必须派生自Throwable类。


模板(通用程序设计)
·特性描述:在不指定某些数据类型的情况下编写函数和类的技术,称为通用程序设计。在函数或类被使用的时候,特定的数据类型会代替函数或类中的未指定部分。所有情况都在编译器的监管之下,不会有任何问题遗留给运行期来决定。模板类的一个典型的例子就是容器类。


·C++:这三种语言中只有C++具有通用类和函数,这些类和函数用T

首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇DisigenPattern设计模式 下一篇面试经历(20):千橡互动猫扑

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: