zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    [转载]linux下svn命令使用大全
    【转载】Js获取当前日期时间及其它操作
    【转载】checkbox复选框的一些深入研究与理解
    IDEA13中配置struts错误:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter +找不到java程序包 解决办法
    【转】jQuery.extend 函数详解
    【转载】Highcharts使用指南
    [转载]几个开源Javascript图形库
    sqlserver数据库创建快照发布遇到的错误:对路径“XXXX”访问被拒绝
    服务器安装ubuntu 14.04 server,开机启动屏幕不停滚动错误WRITE SAME failed. Manually zeroing
    NAT 模式下虚拟机安装的centos7 ping主机显示connect: Network is unreachable
  • 原文地址:https://www.cnblogs.com/caibirdy1985/p/4232971.html
Copyright © 2011-2022 走看看