一、功能比较
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