一、功能比较
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
|
请发表评论