【Gabbing Delva 第1篇】

原创 2004年03月31日 11:25:00

一、多态—2004.03.28

上大学那会儿,我曾经给一对双胞胎兄弟补过英文课。他俩的模样至今依然清晰。哥哥我给他取了个English NameDavid,他很好动,也很能讲;而弟弟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对对象的定义,aTa的实例化,就是Ta这个类的对象。

begin

a.XiongDi(15,130);

a.XiongDi('David');

这是效果图。

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

再来说说在Java中实现OverloadJava的方法和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");

  }

}

编译并执行的结果。

好了,到此我们对delvaoverload算是有了一个感性的认识了。闲话少叙,就先在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.Text:='right';  end;

{ Tson }

function Tson.throwhand: string;

begin  Form1.edit2.Text:='left';   end;

 

//这是对函数的调用:

procedure TForm1.Button1Click(Sender: TObject);

var  FatherUse:Tfather;  SonUse:Tson;

begin

FatherUse:=Tfather.Create;

SonUse:=Tson.Create;

 

FatherUse.throwhand;

SonUse.throwhand;

 

FatherUse.Free;

SonUse.Free;

end;

这是效果图:

我们看到,父类被一个叫virtual的关键字所修饰。这是何故?不加行吗?当然不行,原因就是前面所述,Delphi的方法都是静态的。我们知道,Java中,被修饰成abstract final的方法是不能被覆盖的。由此可知,Delphi的默认的静态方法也不能被覆盖。因此,Delphi定义了两个关键字:virtual(虚拟)和dynamic(动态)。它们让函数和过程成为动态的,用于后关联。Virtualdynamic作用大致相同。只是virtual的方法较dynamic的方法在VMT中占用空间较大,而执行时间较短。这是因为,子类在override父类中的某一个virtual方法时,VMT会为子类提供未被voerride的其它父类的virtual方法。而dynamic则只提供被override的方法。这两个方式个有好处,在Delphi中常被一起使用。

嗯,再多想想。如果父类的一个virtual方法不但要被子类方法override,还要被同一个类中的同名方法overload,那要怎么做呢?看看下面的例子:

type

  Tfather=class

  public   //多了关键字overload
   function throwhand:string; overload;virtual;

   function throwhand(m:integer):integer; overload;virtual;

   end;

type

  Tson=class(Tfather)

  public    //多了关键字reintroduce,我发现不用它也行。但建议使用。

   function throwhand:string;reintroduce;override;

   end;

我们再来看看实现部分:

{ Tfather }

function Tfather.throwhand: string;

begin

 result:='right';

end;

function Tfather.throwhand(m: integer): integer;

begin

result:=m;

end;

{ Tson }

function Tson.throwhand: string;

begin

 Form1.edit2.Text:='left';

end;

这是调用部分:

procedure TForm1.Button1Click(Sender: TObject);

var

  FatherUse:Tfather;

  SonUse:Tson;

begin

FatherUse:=Tfather.Create;

SonUse:=Tson.Create;

 

Form1.edit1.Text:='usehand:'+FatherUse.throwhand+'throwfar:'+inttostr(FatherUse.throwhand(500))+'m';

SonUse.throwhand;

 

FatherUse.Free;

SonUse.Free;

end;

好了,Delphi的覆盖就聊到这里,嘻嘻,该来杯咖啡享受一下了。下面是Java的覆盖,它可没有那么多关键字。

这是Do.java文件的代码:

class A{   //这是父类

  void throwhand(){

    System.out.println("right!");

  }

}

class SA extends A{   //这是子类

  void throwhand(){

    System.out.print("left!");

  }

}

public class Do{

  public static void main(String[] args){

    A  a=new A();   //父类实例化;

    SA s=new SA();  //子类实例化;

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

    System.out.print("Father throwhand is: ");

    a.throwhand();   //调用

    System.out.println(" ");

    System.out.print("Son throwhand is: ");   

    s.throwhand();   //调用

  }

}

这是效果图:

 

到此,我对多态的gab就该结束了。希望你至少没有被我的文字弄烦。如果你真的烦了,那后面的系列文章,哎,不看也罢。

我的第1篇博客

来csdn是2012年的6月份,到现在2014的6月,已经整整2年的时间了,但从没真正写一遍博客,虽然两年前我创建了账号,但感觉我是今天才刚是走进csdn, 这是我第一篇正式的博客,首先我要跟自己确...
  • breaknull
  • breaknull
  • 2014年06月05日 10:02
  • 576

第1篇-JAVA开篇

第3篇-JAVA基础 每篇一句 :目标是给梦想一个期限,行动与坚持就是实现梦想的过程 初学心得: 遇到困难或问题,它不是休止符,而是引向你如何解决问题的标识 (笔者:JEEP/711)[JAVA笔记...
  • JEEP911
  • JEEP911
  • 2017年06月04日 14:38
  • 73

WS网络开发——第1篇

第1篇网络开发基础
  • fengdongjingquan
  • fengdongjingquan
  • 2013年10月26日 14:50
  • 891

HTML的基础学习(第1篇)

1.首先,我们先写一个简单的html文件。 是定义一个一级标题是定义一个段落,书写代码。 代码: 春晓 春眠不觉晓 效果: 2.设置文字样式 定义粗体文本 定义大号字 定义着重文字...
  • hanjing_1995
  • hanjing_1995
  • 2016年06月30日 12:11
  • 160

nyoj 60 谁获得了最高奖学金

谁获得了最高奖学金 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述    某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获...
  • ling_du
  • ling_du
  • 2014年12月05日 20:44
  • 825

2.奖学金发放(4分)

2奖学金发放(4分)题目内容:某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,每项奖学金获取的条件分别如下:1) 院士奖学金:期末平均成绩高于80分(>80),并且在本学期内发表1...
  • a1659091995
  • a1659091995
  • 2017年12月28日 22:29
  • 231

第1篇 单例模式

1.什么是单例模式  单例模式的意思就是对于一个对象来说只有他的一个实例,不可以获取他的多个实例。 2.为什么要用单例模式 有一些地方必须要用到单例模式,或者有些地方使用单例模式可以大大提高程序的运行...
  • u011918771
  • u011918771
  • 2015年01月30日 21:27
  • 607

[Django实战] 第1篇 - 概述

我想写[Django实战]这系列的文章是因为我最近在开发一个数据库脚本发布系统,该系统只限于公司内部使用,它的功能非常简单明了:开发人员通过该系统提交SQL语句,DBA审核后执行,并将结果反馈给开发人...
  • u010415792
  • u010415792
  • 2013年09月07日 14:08
  • 12791

第1篇-己所不欲 勿施于人

这个项目中遇到的问题较多,但我还想强调一个重要的地方,就是己所不欲勿施于人,做经理或者做主管,当你们安排下属做什么事的时候要经常问问自己,这个事情我知道怎么做么,千万不要把自己不知道或者不愿意做的事情...
  • liuguom125
  • liuguom125
  • 2016年01月18日 16:52
  • 125

机器学习笔记——第1篇

文章作者是我的一位大神学长陈雨学长~,征得学长同意后将文章转载到了我的blog上,特在此感谢学长~代码在学长的github上: https://github.com/unnamed2/MDL ...
  • jlu_nnbs
  • jlu_nnbs
  • 2017年05月05日 22:29
  • 399
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Gabbing Delva 第1篇】
举报原因:
原因补充:

(最多只允许输入30个字)