打印本文 打印本文 关闭窗口 关闭窗口
【Gabing Delva 第1篇】
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2039  更新时间:2009/4/23 18:35:14  文章录入:mintao  责任编辑:mintao

一、多态—2004.03.28

上大学那会儿,我曾经给一对双胞胎兄弟补过英文课。他俩的模样至今依然清晰。哥哥我给他取了个English Name叫David,他很好动,也很能讲;而弟弟Davis呢,有点腼腆,但很聪明,从接受能力上更好一点。性格上,David更像姜文,Davis更像姜武,呵呵,我喜欢的两个中国纯爷们儿!这是了解他们之后才发现的。最初见到他们时,我常常要问,你们谁是哥哥来着。

嗯,说起这件小事是为了聊一下delva中的多态。

先来聊聊重载问题(也叫超载,总之是那个Overload)吧。在同一个类中,出现多个同名的方法的现象就是Overload。联系起上面提到的兄弟俩,我想这更好理解。他们从外观上是相似的,不同的是某些“参数”,类型上可能各异或是个数上不同。

在Delphi中,所有方法都默认是静态的,便于编译器和链接器解析调用。为实现超载,要在方法明的后面加上关键字overload,不然会产生报错。先看个小例子吧:

type            //这是Delphi对类Ta的定义部分

  Ta=class 

  public

   procedure XiongDi(age,height:integer);overload; //这是Ta的两个公共过程,名字一样

   procedure XiongDi(name:string);overload;     //但他们的参数不同。

  end;

implementation  //以下为实现部分

procedure Ta.XiongDi(age, height: integer);     //这是两个过程的实现。

begin

Form1.Edit1.Text:=''''age:  ''''+inttostr(age)+''''  height:  ''''+inttostr(height);

end;

procedure Ta.XiongDi(name: string);

begin

Form1.Edit2.Text:=''''name:  ''''+name;

end;

{Delphi用很强的图形化控件,我们用一个窗体的Button控件来激活上述过程,并用Edit控件显示结果。}

procedure TForm1.Button1Click(Sender: TObject); 

var

a:Ta;  //这是Delphi对对象的定义,a是Ta的实例化,就是Ta这个类的对象。

begin

a.XiongDi(15,130);

a.XiongDi(''''David'''');

这是效果图。

我们看到第一个XiongDi反映的是年龄和身高信息,而第二个XiongDi则反映的是姓名信息。它们的参数个数和类型都不同,要表达的效果也就不同。所以,面对Overload我们不要被表面上的名称所迷惑,而应该了解函数、过程和方法实质的作用。多说一句,函数和过程是Delphi里的叫法,Java中统成为方法,无返回值的方法用void关键字表示,代表Delphi里的过程,而有返回值的方法就是Delphi中的函数。

再来说说在Java中实现Overload。Java的方法和Delphi刚好相反,所有方法都默认成虚拟的,所以Java中可以随时Overload而不需要标明我要超载这个方法了。为了对比,我在Java中写个和上面一样的例子:

A.java文件:

class A{  //这是Java中对类A的定义。

  public void XiongDi(int age,int high){  //这里定义了两个同名方法

    System.out.println("age:  "+age+" high:  "+high);

  }

 

  public void XiongDi(String name){

    System.out.println(name);

  }

}

Do.java文件:

public class Do{

  public static void main(String[] args){

   A a=new A();

   a.XiongDi(15,130);

   System.out.println(" **********");

   a.XiongDi("David");

  }

}

编译并执行的结果。

好了,到此我们对delva的overload算是有了一个感性的认识了。我们可以看到,重载事发生在同一个类中,不同方法之间的现象。就像两兄弟之间一样。呵呵,如果是父子之间又会发生什么有趣的现象呢?

投掷,这个从我们祖先继承下来的动作,因人而异。比如,我的爸爸投掷东西时是用右手,而我是个左撇子。这种动作相同而执行方式不同的现象就是下面我们要聊的覆盖(又叫改写,就是Override)。嘿嘿,Overload、Override,我们中国人看到这两个相似的单词,最初都有些迷惑,就像老外看到横戌点戍空心戊一样,而他们其实大不相同。覆盖事发生在父类和子类的方法之间的。我们聊到这里就决不会再弄混这两个名词了。但我要说的是,他们还是有联系的。那就是他们同为面向对象编程的主要特点,是包装、继承和多态三大要素中,多态的具体表现。

闲话少叙,就先在Delphi中来个覆盖的小例子吧:

type

  Tfather=class  //我们定义一个父类

  public

   function throwhand:string; virtual;

   end;

type

  Tson=class(Tfather)  //我们定义一个继承父类的子类

  public

   function throwhand:string;override;

   end;

 

//这是两个函数的实现:

{ Tfather }

function Tfather.throwhand: string;

begin  Form1.edit1.

[1] [2] [3]  下一页

打印本文 打印本文 关闭窗口 关闭窗口