转: Delphi的OverRide、OverLoad和Virtual方法

http://blog.csdn.net/ckli/article/details/2201418

override 重写 也叫覆盖
1.方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。
子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

2. Delphi 的函数覆盖(Override)与重载(overload)
而Delphi 就是用override 关键字来说明函数覆盖的。被覆盖的函数必须是虚(virtual)的,或者是动态(dynamic)的,也就是说该函数在声明时应该包含这两个指示字中的一个,比如:

procedure Draw; virtual;
在需要覆盖的时候,只需要在子类中用override 指示字重新声明一下就可以了。
procedure Draw; override;

3.virtual 虚类型
  dynamic 动态
  overload 重载
  override 重写
4.★★★关于方法定义关键字的说明:
    如果在过程定义声明时包括了的关键字的含义:
    static 表示是静态方法;静态方法是方法的缺省类型,不能被覆盖;
    virtual 表示是虚拟方法;
    dynamic 表示是动态方法;
      这两类方法的共同点是都可以被覆盖(override),区别仅在于运行时调用方法时的派发机制,virtual方法为执行速度做了优化,      而dynamic方法则为代码大小做了优化;经常被覆盖的方法应该定义为virtual方法;
    message 表示是消息处理方法;在关键字message后面的值指明了这个方法要响应的消息;用消息处理方法来响应Windows的消息,这样就不用直接来调用它;
    override 表示是覆盖方法;要求祖先类中必须有该方法的定义,并且参数的顺序和类型及返值的类型必须匹配;    用于扩展祖先类中的该方法而不是取代它(如不调用祖先类中的该方法则等同于取代);拓展类有inherited即可继承,inherited可以写任意行表示什么时候执行父类的代码;
    overload 表示是重载方法;用于一个类中有许多同名的方法带着不同的参数表的情形;(属性的读写方法不能被重载);
    abstract 表示是抽象方法;是没有实现的方法,并且必须是virtual或dynamic方法,即在abstract前面必须有virtual或dynamic关键字,其实现部分在派生类中;如
        procedure DoSomething; virtual; abstract;
    reintroduce表示是重新声明的方法;用于方法的名称与祖先类中的某个方法名称相同的情形;

5.virtual 和 dynamic定义的虚函数,都是为了子类override用的,
  只不过它们的实现不一样 vitrual 占用的空间大点,但速度快些。dynamci正好相反.

stdcall是一种调用方式,标明了参数入stack的顺序和清除的方式,具体可看
Delphi的帮助. 
时间: 2024-07-29 17:07:10

转: Delphi的OverRide、OverLoad和Virtual方法的相关文章

delphi的override、overload和virtual方法

1.方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现. 如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding).子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了. 如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overload

Virtual方法(虚方法)和Abstract方法(抽象方法)

一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况:情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法.情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法.那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法. 当一个方法被声明为Virtual时,它是一个虚拟方法,直到你使用ClassName variable =

C#基础知识:virtual方法,abstract方法,区别

virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可以在派生类中被重写.默认情况下,类中的方法是非虚的,非虚的方法不能在子类中被覆盖(override),但是可以隐藏(new),但这不影响父类方法的功能.为了达到子类以自己的方法实现某一功能的目的,需要在父类中用virtual关键字来修饰方法,这样,在其继承子类中就可以采用覆盖的方法来提供方法的多态机制.virtual关键字在类中修饰方法需要注意以下几点: 1. virtual修饰类中方法时,前面必须有public修饰符,非虚方

[转]Delphi调用cmd的两种方法

delphi调用cmd的两种方法vars:string;begins:='cmd.exe /c '+edit1.Text+' >c:\1.txt';winexec(pchar(s),sw_hide);sleep(2000);memo1.Lines.LoadFromFile('c:\1.txt'); 2shellexecute(handle,nil,'cmd.exe',pchar(form2.edit1.text),nil,sw_hide);WinExec主要运行EXE文件.如:WinExec(’

delphi EncdDecd.pas单元中Encoding方法出现#$D#$A的解决方法

例如: s:= 'http://detail.tmall.com/item.htm?id=45545826531&abbucket=_AB-M129_B17&acm=03130.1003.1.161728&aldid=4HatiDee&abtest=_AB-LR129-PV129_1393&scm=1003.1.03130.13_45545826531_161728&pos=6#detail'; s:=Encoding(s);  //加密后的字符串中间就会多

用Delphi实现文件下载的几种方法

笔者最近开发的系统中需要写一个下载文件的功能.以前用BCB调用API写的很烦琐,忽然想起有一个API就可以搞定了,于是一大早就来搜索.这个API就是UrlDownloadToFile.不仅如此,Delphi的一些控件也可以轻松实现下载,如NMHTTP,指定NMHTTP1.InputFileMode := ture; 指定Body为本地文件名,指定Get就可以下载了.下面是详细代码,均出自CSDN.我把它们都整理到这儿,让大家方便查阅. uses UrlMon; function Download

Delphi中文件流的使用方法

在Delphi中,所有流对象的基类为TStream类, 其中定义了所有流的共同属性和方法.TStream类中定义的属性介绍如下: 1.Size: 此属性以字节返回流中数据大小. 2.Position: 此属性控制流中存取指针的位置. Tstream中定义的虚方法有四个:1.Read:此方法实现将数据从流中读出.函数原形为:Function Read(var Buffer;Count:Longint):Longint;virtual;abstract;参数Buffer为数据读出时放置的缓冲区,Co

Java Override/Overload

重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能够根据需要实现父类的方法. 在面向对象原则里,重写意味着可以重写任何现有方法.实例如下: class Animal{ public void move(){ System.out.println("动物可以移动"); } } class Dog extends Animal{ public

Python interview - override & overload

我们先说overload 重载. 在Java中,支持重载,重载的意思是能够定义有相同方法名的方法,传入方法中的参数个数,或者参数类型不同.比如: int mymethod(int a, int b) int mymethod(int num) float mymethod(int a, float b) float mymethod(float var1, int var2) int mymethod(int a, int b) int mymethod(float var1, float va