• 深入类中的方法[10] - 构造方法与析构方法


    //构造方法就是对象建立时调用的方法; 析构方法就是对象销毁时调用的方法. :
    
    
    
    
    

     
    
    TMyClass = class(TObject)
    
    public
    
      constructor Create;           {构造方法}
    
      destructor Destroy; override; {析构方法}
    
    end;
    
    
    
    
    

     
    
     
    
    {几个要点:
    
      这两个方法都可以追溯到所有类的祖先类 TObject;
    
      它们都属于类方法, 尽管没有 class 标识符;
    
      但和类方法也有区别: 一般的类方法不能使用类中非静态数据; 但它们可以.
    
     
    
      必须使用 constructor  destructor 来定义, 但名称未必是: Create  Destroy;
    
      如果不使用 Create  Destroy 的命名会带来很多麻烦, 没必要尝试.
    
     
    
      我们自己的代码在 Create 中是执行在父类的 Create 代码之后;  Destroy 中执行在之前;
    
      所以, 一般会用这样的语句格式 
    
    }
    
    
    
    
    

     
    
    constructor TMyClass.Create;
    
    begin
    
      inherited;
    
      //...
    
    end;
    
     
    
    destructor TMyClass.Destroy;
    
    begin
    
      //...
    
      inherited;
    
    end;
    
    
    
    
    

     
    
    {
    
      Create 是我们用得最多的方法;  Destroy 是我们用得最少的方法;
    
      因为通过 Free 调用 Destroy 更安全一些.
    
     
    
      Destroy 是一个虚方法; Create 在祖先类中虽然是静态方法, 但在很多实用的类中也成了虚方法;
    
      所以在覆盖或重载时应区别对待.
    
    }
    
    
    
    
    

     
    
     
    
    // Create 应该是受到编译器特别对待的一个方法, 譬如:
    
    TMyClass = class(TObject)
    
    public
    
      constructor Create;
    
    end;
    
     
    
    {从道理上来讲, 这会隐藏或替换了父类的 Create ; 但实际上没有, 编译器肯定要做一个幕后工作!}
    
    
    
    
    

     
    
     
    
    //再如: 
    
    TMyClass = class(TObject)
    
    public
    
      constructor Create(x,y: Integer);
    
    end;
    
     
    
    var
    
      Form1: TForm1;
    
     
    
    implementation
    
     
    
    {$R *.dfm}
    
     
    
    { TMyClass }
    
    constructor TMyClass.Create(x, y: Integer);
    
    begin
    
      //inherited Create;
    
      //...
    
    end;
    
    
    
    
    

     
    
    {
    
      编译器竟也允许没有 overload 的重载; 竟也允许去掉这句: inherited Create;
    
      如果没有 TObject.Create 方法, 类如何初始化、分配内存? 
    
      所以这都是表面现象, 我想编译器会自动 overload、自动 inherited Create .
    
     
    
      其他方法不会有这些特殊待遇的, 看来哪都有走后门的.
    
    }
    

     

  • 相关阅读:
    分组PARTITION BY及游标CURSOR的用法
    dotnet core 3.1+consul 学习(1)
    常用状态码
    docker 安装consul以及部署consul集群
    泛型
    redis面试题(1)
    asp net core 3.1启动过程源码解读
    .net core 2.x到3.x变化 -> Endpoint Routing
    jwt登录验证逻辑
    .Net Core3.1+Jenkins+Docker+Git实现自动化部署
  • 原文地址:https://www.cnblogs.com/luckForever/p/7255016.html
Copyright © 2020-2023  润新知