delphi,D7record,object,class区别比较

一、功能比较

record:

1.不支持继承

2.不支持作用域

3.不支持方法、属性(D2005后支持)

4.支持栈、堆内存(具体与声明的变量相同,无需构造函数)

5. 赋值类型(支持赋值操作符:=)

6.支持内置集合类型

7.支持变体定义

注:D7以后的版本的record新增了很多特性,部分不一样,支持helper 支持作用域,支持构造函数等等。。。新版的record已经刷新三观。

object:

1.支持继承

2.支持作用域(不支持Published)

3.支持方法、属性,支持Self

4.支持栈、堆内存(具体与声明的变量相同,无需构造函数)

5. 赋值类型(支持赋值操作符:=)

6.支持内置集合类型

7.不支持变体定义

注意:该关键字实际上是turbo pascal时期使用的,Object pascal已经不再建议使用object关键字来定义类了,而且其角色已被新版本Delphi的record代替

class:

1.支持继承

2.支持作用域

3.支持方法、属性,支持Self

4.只支持堆内存(分配需调用构造函数)

5. 指针参数类型(不支持赋值操作符:=)

6.支持内置集合类型

7.不支持变体定义

测试代码:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Memo1: TMemo;

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

TTestRecord = record

P1: Integer;

S: (S2, S3, S4);//内置集合类型

FTEST: Integer; //成员定义

case Byte of //支持变体的定义

0:( C1: Byte);

1:( C2: Char);

{type

TTT = Integer;

var

FTEST: TTT;}

//case

end;

TTestClass = Class

private

FTEST: Integer;

FP1: Integer;

S_C: (S_C2, S_C3, S_C4);//内置集合类型

procedure SetP1(const Value: Integer);

public

function Test(Name:string):Integer;

property P1: Integer read FP1 write SetP1;

end;

TTestObject = object

private

FTEST: Integer;

FP1: Integer;

S_O: (S_O2, S_O3, S_O4);//内置集合类型

procedure SetP1(const Value: Integer);

public

function Test(Name:string):Integer;

property P1: Integer read FP1 write SetP1;

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

function TestRecord_Test(Name:string; var TestRecord: TTestRecord): Integer;

begin

Result := TestRecord.FTEST;

Form1.Memo1.Lines.Add('================='+Name+'==========');

Form1.Memo1.Lines.Add(Name+'.Address(@FTEST):='+IntToStr(Integer(@TestRecord.FTEST)));

Form1.Memo1.Lines.Add(Name+'.P1 :='+IntToStr(Integer(TestRecord.P1)));

Form1.Memo1.Lines.Add(Name+'.FTEST:='+IntToStr(TestRecord.FTEST));

Form1.Memo1.Lines.Add(Name+'.C1 :='+IntToStr(TestRecord.C1));

Form1.Memo1.Lines.Add(Name+'.C2 :='+TestRecord.C2);

end;

procedure TForm1.FormCreate(Sender: TObject);

var

TestObject1, TestObject2: TTestObject; //栈内存

TestClass1, TestClass2 : TTestClass; //堆内存

TestRecord1, TestRecord2: TTestRecord; //栈内存

begin

//Object

TestObject1.FTEST := 1;

TestObject1.P1 := 2;

TestObject1.Test('TestObject1');

TestObject2 := TestObject1;

TestObject2.Test('TestObject2');

//Class

TestClass1 := TTestClass.Create;

TestClass1.FTEST := 1;

TestClass1.P1 := 2;

TestClass1.Test('TestClass1');

TestClass2 := TestClass1;

TestClass2.Test('TestClass2');

//Record

TestRecord1.FTEST := 1;

TestRecord1.P1 := 2;

TestRecord1.S := S3;

TestRecord1.C1 := 48;

TestRecord_Test('TestRecord1', TestRecord1);

TestRecord2:= TestRecord1;

TestRecord_Test('TestRecord2', TestRecord2);

end;

{ TTestObject }

procedure TTestObject.SetP1(const Value: Integer);

begin

FP1 := Value;

end;

function TTestObject.Test(Name:string): Integer;

begin

Result := Self.FTEST;

Form1.Memo1.Lines.Add('================='+Name+'==========');

Form1.Memo1.Lines.Add(Name+'.Address(@FTEST):='+IntToStr(Integer(@FTEST)));

Form1.Memo1.Lines.Add(Name+'.P1 :='+IntToStr(Self.P1));

Form1.Memo1.Lines.Add(Name+'.FTEST:='+IntToStr(Self.FTEST));

end;

{ TTestClass }

procedure TTestClass.SetP1(const Value: Integer);

begin

FP1 := Value;

end;

function TTestClass.Test(Name:string): Integer;

begin

Result := Self.FTEST;

Form1.Memo1.Lines.Add('================='+Name+'==========');

Form1.Memo1.Lines.Add(Name+'.Address(@FTEST):='+IntToStr(Integer(@FTEST)));

Form1.Memo1.Lines.Add(Name+'.P1 :='+IntToStr(Self.P1));

Form1.Memo1.Lines.Add(Name+'.FTEST:='+IntToStr(Self.FTEST));

end;

end.

测试返回结果:

=================TestObject1==========

TestObject1.Address(@FTEST):=1244692

TestObject1.P1 :=2

TestObject1.FTEST:=1

=================TestObject2==========

TestObject2.Address(@FTEST):=1244684

TestObject2.P1 :=2

TestObject2.FTEST:=1

=================TestClass1==========

TestClass1.Address(@FTEST):=9779844

TestClass1.P1 :=2

TestClass1.FTEST:=1

=================TestClass2==========

TestClass2.Address(@FTEST):=9779844

TestClass2.P1 :=2

TestClass2.FTEST:=1

=================TestRecord1==========

TestRecord1.Address(@FTEST):=1244676

TestRecord1.P1 :=1

TestRecord1.FTEST:=1

TestRecord1.C1 :=48

TestRecord1.C2 :=0

=================TestRecord2==========

TestRecord2.Address(@FTEST):=1244664

TestRecord2.P1 :=1

TestRecord2.FTEST:=1

TestRecord2.C1 :=48

TestRecord2.C2 :=0