delphi(D7)record,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

 

posted on 2011-10-14 11:03  峋山隐修会  阅读(2852)  评论(0编辑  收藏  举报

导航