1.动态联编可以通过两种方法实现,一种是使用 virtual 和 dynamic,虚方法和动态方法在功能上是等价的,他们的不同在于:虚方法的调用速度比较快,而动态方法的代码数量比较少。
2.虚方法和动态方法可以使用指令字 abstract 说明,则该方法为抽象方法,包含抽象方法的类被称为抽象类。
3.抽象方法不可以定义函数体,本身必须是虚方法或动态方法。
抽象方法的测试:
program Project1;
{$APPTYPE CONSOLE}
type
{ A类 }
Ta = class
procedure show;virtual;abstract;
end;
{ B类 }
Tb = class(Ta)
procedure show;override;
end;
{ B类型的implement方法实现 }
procedure Tb.show;
begin
Writeln('B');
end;
var
x:Tb;//定义一个B类对象
begin
x := Tb.Create;//实例化一个对象
Writeln('1.首先定义了一个 Ta 类,它具有一个abstract,virtual的 show 方法');
Writeln('2.从 Ta 类派生出一个 Tb 类,它 override 了 Ta 类中的 show 方法');
Writeln('3.实现 Tb 中的 show 方法');
Writeln('4.定义一个 Tb 类变量 x 并实例化,调用 x 的 show 方法,显示如下:');
x.show;
Readln;
end.
4.delphi7中具有2中多态,一种是编译时多态,一种是运行时多态。编译时的多态是指 overload 重载,应为编译器可以根据方法的参数个数和类型就可以知道将原代码翻译成不同的代码;动态多态是指虚方法。编译时不能确定具体运行哪种方法,只有在运行时才能确定。
5 overload 测试
program Project1;
{$APPTYPE CONSOLE}
uses
{ 在使用 inttostr 或 floattostr 时,需要引用这个单元}
SysUtils;
{
function : find the max from a and b
parameters:
a:integer
b:integer
return
integer;
}
function Max(var a,b : Integer):Integer;overload;
begin
if a > b then
result := a
else
result := b;
end;
{
function : find the max from a and b
parameters:
a:real;
b:real;
return
real;
}
function max(var a,b : Real):Real;overload;
begin
if a > b then
result :=a
else
result := b;
end;
var
x,y,max1:Integer;
a,b,max2:real;
begin
x := 1;
y := 2;
a := 1.1;
b := 1.2;
max1 := Max(x,y);
max2 := Max(a,b);
Writeln('定义了2个同名函数 Max,参数不一样');
Writeln('max1 = ' + inttostr(max1));
Writeln('max2 = ' + floattostr(max2));
Readln;
end.
6.delphi中有一个指向调用本方法的对象的指针。self,谁调用这个方法,self就指向谁。
相当于java 中的 this 。
7.如果function 和 procedure 用class 修饰,则这个方法属于类,而不属于具体的对象。
相当于java 中的静态方法。