一、override  重载
type
TFigure = class
procedure Draw; virtual;//(我的理解是)父类中可以使用父类的,子类中使用子类的。与“四”是有区别的。
end;
TRectangle = class(TFigure)
procedure Draw; override;//a1
end;
TEllipse = class(TFigure)
procedure Draw; override;//a2
end;
使用
var
Figure: TFigure;
begin
Figure := TRectangle.Create;
Figure.Draw; // 执行a1
Figure.Destroy;
Figure := TEllipse.Create;
Figure.Draw; // 执行a2
end; 二、overload 多态
procedure foo(i: integer); overload;
procedure foo(d: double); overload;
procedure foo(v: variant); overload;
典型用法。如果是对于继承的。必须使用reintroduce
type
T1 = class(TObject)
procedure Test(I: Integer); overload; virtual;
end;
T2 = class(T1)
procedure Test(S: string); reintroduce; overload;
end;
...
SomeObject := T2.Create;
SomeObject.Test('Hello!'); // T2.Test
SomeObject.Test(); // T1.Test 三、override & inherited
override是用来重载父类的procedure,
如果父类是virtual 或者 dynamic 方法的,就可以使用inherited,来调用父类中的代码。 四、abstract
procedure DoSomething; virtual; abstract;//如果是这个样式的,表示要在子类中实现(代码)。而父类中,其他procedure function可以使用这个procedure。
(这里的virtual似乎不能被dynamic替换)。
使用procedure DoSomething; virtual; abstract;和procedure DoSomething; virtual;的区别就是,前者的实现代码在子类,而后者实现代码在自身。后者可以在子类中override一下,使其子类也有自己的实现代码。
--
在最近的代码中发现(不知道是不是D7的缘故)
procedure DoSomething; virtual; abstract;
procedure DoSomething; dynamic; abstract;
都是可以的。
而且在继承类中也可以不写实现代码。
在基类中如果要判断有没有被继承类写实现代码的方式不是
if Assigned(DoSomething) then ...
而是
if MethodAddress('DoSomething')<>nil then... 五、reintroduce
覆盖父类中的virtual 方式的内容。(编译器不会提示“xxx 被hide了”) 六、static
默认就是这个。
我们常打 procedure test(xx:Integer);其实就是static的。
这个比较好理解。
如果子类中,声明了一个test,跟父类无关。各自用各自的。
除非使用强制转换。比如:
type
TFigure = class
procedure Draw;
end;
TRectangle = class(TFigure)
procedure Draw;
end;
//实现
var
Figure: TFigure;
Rectangle: TRectangle;
begin
Figure := TFigure.Create;
Figure.Draw; // 父类用父类的 TFigure.Draw
Figure.Destroy;
Figure := TRectangle.Create;
Figure.Draw; // 虽然初始化为子类,但是由于申明的是父类,所以Figure还是调用了父类的Draw TFigure.Draw
TRectangle(Figure).Draw; // 强制转换成子类,就可以用TRectangle.Draw
Figure.Destroy;
Rectangle := TRectangle.Create;
Rectangle.Draw; // 子类用子类的 TRectangle.Draw
Rectangle.Destroy;
end; 七、forward declaration提前定义。
用于类被提前使用。注意fd的class后面要立即加“;”不能使用括号和基类。
type
TFigure = class; // forward declaration
TDrawing = class
Figure: TFigure;
...
end;
TFigure = class // defining declaration
Drawing: TDrawing;
...
end; 八、virtual 和 dynamic
虚拟方法占用的内存大,调用速度快;动态方法相反。
如今,哪有PC内存不够的。
所以,笔者建议,就使用virtual吧。
--
我知道了,内存是有不够用的时候。
所以这里修改说法,需要来回调用的用virtual,一般只用到1,次的用dynamic。
像笔者一般写一个基类函数,只用一次,所以大部分都改成dynamic了。
但是有个地方必须要用virtual
private
FItem:Integer
procedure SetItem(Value:Integer);virtual;//dynamic不允许
public
property Item:Integer;read FItem write SetItem;
end;

参考:http://www.cnblogs.com/key-ok/p/3380401.html

Delphi重载,覆盖,多态的更多相关文章

  1. C++中的重载隐藏覆盖&&JAVA中的重载覆盖&&多态

    class 类继承默认是private, struct 默认继承是public C++中的隐藏: 只要派生类中出现和基类一样的函数名,基类中的函数就会被派生类中的函数给隐藏(如果派生类和基类中的函数名 ...

  2. [转帖]Java中重写和重载与多态的关系

    Java中重写和重载与多态的关系 2019-09-05 00:57:41 留下一天今天 阅读数 67  收藏 更多 分类专栏: java进阶之路   版权声明:本文为博主原创文章,遵循CC 4.0 B ...

  3. C++重载覆盖隐藏

    写一个程序,各写出重载覆盖 1 // // main.cpp // 2013-7-17作业2 // // Created by 丁小未 on 13-7-17. // Copyright (c) 201 ...

  4. [Java] 继承,隐藏,覆盖,重载,多态,抽象类,接口

    1.子类 class SonClass extends ABC{...} 在子类定义后,子类中就可以直接隐式包含父类的成员变量和方法,而不用再写,这就是使用继承的优点. 子类包含父类的成员,不是子类和 ...

  5. C# 继承、虚方法、方法重载和多态

    继承:继承属于单继承,只能继承一个父类. 继承的一个结果是派生于基类的子类在方法和属性上有一定的重叠. 继承只能够同时继承与一个基类:可以同时继承一个基类和多个接口,但是基类必须放在第一个.(注:C# ...

  6. Java 学习(12):重写(Override)与重载(Overload) & 多态

    目录 --- 重写 --- 重载 --- 多态 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可 ...

  7. C++之重载覆盖和隐藏

    继承体系下同名成员函数的三种关系 重载 在同一作用域内 函数名相同,参数列表不同(分三种情况:参数个数不同,参数类型不同,参数个数和类型都不同) 返回值类型可以相同也可以不同 重写(覆盖) 在不同作用 ...

  8. c/c++:重载 覆盖 隐藏 overload override overwrite

    http://www.cnblogs.com/qlee/archive/2011/07/04/2097055.html 成员函数的重载.覆盖与隐藏成员函数的重载.覆盖(override)与隐藏很容易混 ...

  9. c++ 继承 虚函数与多态性 重载 覆盖 隐藏

    http://blog.csdn.net/lushujun2011/article/details/6827555 2011.9.27 1) 定义一个对象时,就调用了构造函数.如果一个类中没有定义任何 ...

随机推荐

  1. python第三方库推荐 - 通过ntplib在windows上同步时间

    很多时候我们有通过程序脚本同步校正北京时间的需求. 在linux上同步时间比较方便,安装个ntpdate软件就行了. 但是在windows的要同步时间比较麻烦. 这时想到的就是从网络获取一个准确的时间 ...

  2. tcp ip参数详解

    http://www.cnblogs.com/digdeep/p/4869010.html 1. TCP/IP模型 我们一般知道OSI的网络参考模型是分为7层:“应表会传网数物”——应用层,表示层,会 ...

  3. 关于 Android 进程保活,你所需要知道的一切

    早前,我在知乎上回答了这样一个问题:怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死?.关于 Android 平台的进程保活这一块,想必是所有 Android 开发者瞩目的内容之一.你 ...

  4. objective c 学习(一)

    问题一:我在程序中看到大量的减号.中括号和NS****这种东西,他们是什么玩意儿? 1 减号(或者加号) 减号表示一个函数.或者方法.或者消息的开始,怎么说都行. 比如c#中,一个方法的写法可能是: ...

  5. Log4j 2.0 使用说明

      原文地址:http://blog.csdn.net/welcome000yy/article/details/7962447 Log4j 2.0 使用说明(1) 之HelloWorld 最近刚接触 ...

  6. spring下载dist.zip

    http://repo.springsource.org/libs-release-local/org/springframework/spring/ 选择对应版本下载即可

  7. CakePHP之控制器

    控制器 控制器是MVC中的“C”. 如果你的网站使用Cake框架制作,一般根据url地址和通过路由,就会找到正确的控制器,然后控制器的动作就会被调用. 一个控制器需要解释请求数据.确保使用正确的模型. ...

  8. 【转】 UITableViewCell的标记、移动、删除、插入

    原文: http://blog.csdn.net/duxinfeng2010/article/details/7725897 这篇文章是建立在 代码实现 UITableView与UITableView ...

  9. 图的遍历(bfs 和dfs)

    BFS的思想: 从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1.V2.……Vn,然后依次访问与V1.V2……Vn相邻且未被访问的顶点.如此继续,找到所要找的顶点或者遍历完整个 ...

  10. JQUERY、AJAX双击DIV,直接修改DIV内的内容

    最近在做后台功能开发的时候,用到对排序字段的修改,感觉只为了修改一个排序值,而要重新进入编辑页比较麻烦,于是自己动手写…… 最近在做后台功能开发的时候,用到对排序字段的修改,感觉只为了修改一个排序值, ...