Delphi面向对象编程思想读书笔记3——理解对象

送分小仙女□ 提交于 2020-04-07 14:16:38

对象的本质

  1. 计算机内存常用的有两块,栈(stack)和堆(heap)。
  2. 对象的引用存储在栈中,栈中的变量是不需要由程序员手动去释放内存空间的。简单数据类型的值和对象的引用存储在栈中,对象存储在堆中。
  3. 查看创建对象所占用内存的大小,调用InstanceSize()方法,从TObject继承。
  4. 对象引用和类引用。对象是类的动态实例,对象总是被动态分配到堆上,一个对象引用就如同一个句柄或者一个指针。一个对象引用通常以一个变量的形式存在,也有函数或者属性返回值的形式。类引用类型是类的模板。类引用最普遍的使用是通过调用构造函数来生成该类的实例,也可以用引用类测试对象类型(is)或者将对象转换为特定类型(as)。
  5. 常用的参数床底机制分为值传递和引用传递(var)。
  6. 赋值操作符(:=)将一个对象的以用赋值给一个对象变量。Assign和AssignTo方法可以将对象属性进行赋值。
  7. 简单的数据类型(如Integer,Char,Record等)无论作为参数还是变量都是按值传递和使用的,通常称为值类型。对象变量是引用类型变量,分配一个对象引用给一个变量时,Delphi仅复制引用,而不是整个对象。

    对象的生死

Delphi用Constructor声明一个构造函数Create,可在对象产生的时候调用。用Destructor声明一个析构函数Destroy,将在对象销毁的时候调用。

  1. Destroy直接销毁对象,Free会检查对象是否存在,如对象存在,或者对象不为空,调用Destroy。FreeAndNil调用Free后将对象置为空。
  2. 构造时应该从基类开始按继承的层次孙旭调用,析构的时候顺序正好相反。
  3. 属主(owner)机制。属主(owner)机制就是设计模式中典型的结构型模式COMPOSITE(组合),Application向其所拥有的对象发送析构的消息的方式,典型的行为模式Observer(观察者)。
  4. 示例程序3-10 没明白的地方
    constructor TControlFactory.create(Aowner: TWinControl;
    ControlClass: TControlClass);
    begin
    FControlObj :=  ControlClass.Create(Aowner);
    FControlObj.Parent := Aowner;
    FControlObj.Name := FControlObj.ClassName;
    FControlObj.SetBounds(10,10,250,150);
    self := TControlFactory(FControlObj);    //这句话不明白
    end;
  5. 创建有属主的组件不需要手工销毁,创建组件时指定属主在效率上不划算。
  6. 对象的关系
    (1)泛化关系:表现类(对象)的父子继承特性。
    (2)聚合和组合关系:表现类(对象)的部分和整体的合成特性。
    (3)依赖和合作关系:表现类(对象)的互作用特性。
  7. 原始数据(简单的数据类型)和对象(类类型)的区别。原始数据可以看作一个只有单一属性并且不具有方法的简单对象。

  8. 继承和合成,TVehicle(车辆)类由TWheel(轮胎)合成, TBicycle继承了TVehicle,TCar继承TVehicle并且由FEngine(发动机)合成。
  9. 合成包含组合和聚合。发动机对于TCar是组合(生命周期依赖骑车的生命期),GPS导航系统对于TCar是聚合(生命周期无需依赖骑车的生命期),下图是UML示例图。
    Delphi面向对象编程思想读书笔记3——理解对象
  TGPSReceiver = class (TObject)
  public
    procedure Navigate;
  end;

  TEngine = class (TObject)
  private
    FCapacity: Integer;
    FPower: Integer;
  public
    procedure start;
    procedure stop;
  end;

  TWheel = class (TObject)
  private
    FNo: Integer;
    FSize: Integer;
    FTypeName: string;
    procedure check;
  public
    constructor create(size:Integer;TypeName:string;No:Integer);
  end;

  TVehicle = class (TObject)
  protected
    FColor: string;
    FMake: string;
    FTopSpeed: Integer;
    FWheel: TWheel;
    FWheels: TList;
    procedure SlowDown;
    procedure SpeedUp;
    procedure Start;
    procedure Stop;
  end;

  TBicycle = class (TVehicle)
  public
    constructor create;
    destructor Destory;
    procedure ride;
  end;

  TCar = class (TVehicle)
  private
    FGPSReceiver: TGPSReceiver;
    FTopSpeed: Integer;
  protected
    FEngine: TEngine;
  public
    constructor create(GPS:TGPSReceiver;color:string;Make:string;
            TopSpeed:Integer);
    destructor Destory;
    procedure drive;
    property GPSReceiver: TGPSReceiver read FGPSReceiver write FGPSReceiver;
    property TopSpeed: Integer read FTopSpeed write FTopSpeed;
  end;
  1. 依赖关系和合作关系

TPerson类的对象与TCar类的对象与TBicycle类的对象存在依赖关系。虚线指向依赖。GPS导航系统与人之间是合作关系,用实线表示。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!