天天看点

Pascal基础(八)-OOP续与运算符重载Pascal基础(八)-OOP续与运算符重载

Pascal基础(八)-OOP续与运算符重载

record, object, class 三个关键字异同

record的特点与使用场景

record 类似与C语言的struct, 分配在栈(Stack).

默认不支持方法(function)和过程(procedure),开启

{$modeSwitch advancedRecords}

则可以支持方法和函数

record可以实现C语言中union的相同效果,在和C语言开发的lib调用时可能用到

class的特点与使用场景

class 就和现在C#,java类似, 默认支持字段,属性,方法,属性。可以使用public,private,protected等作用域关键字,内存分配在堆(Heap).

object的特点与使用场景

object 是兼容性导致的遗留关键字,目前几乎用不到。它的功能和class类似。

和class的不同点是内存可以在栈(默认),也可以在堆(使用new) 。目前不建议使用

OOP基本

  • 单继承,默认继承自TObject
  • 构造函数可以有多个, 析构只能有一个
  • 构造函数需要开发者使用inherited调用基类的构造函数
  • 声明析构函数时需要加上override关键字

其它见Pascal基础(三) - OOP

运算符重载

type
  TVector2 = record
  public
    x, y: single;
    procedure Normalize();
    function Length(): single;
    class operator +(const v1, v2: TVector2): TVector2; inline;
    class operator +(v: TVector2; z: single): TVector2; inline;
  //class operator + (z:single;v:TVector2):TVector2;inline;
    class operator -(const v1, v2: TVector2): TVector2; inline;
  //class operator - (const v:TVector2):TVector2;inline;
    class operator / (v: TVector2; z: single): TVector2; inline;
    class function Equals(const V1, V2: TVector2): boolean; overload; inline; static;
    class function Equals(const V1, V2: TVector2; const Epsilon: single): boolean;
        overload; inline; static;
    function ToString: string;

    function IsZero: boolean;

  end; 
           

调用代码示例

program test;

{$mode objfpc}{$H+}

uses
  SysUtils,
  Classes,
  vector2;

var
  a: TVector2;
  f: TVector2;
  g: TVector2;
begin

  f.x := 10;
  f.y := 20;

  g := f + 10.0;
  g := f / 2;


  writeln(g.ToString);
  a := g + f;
  writeln(a.toString);

end.
           

完整代码见 https://gitee.com/tom-cat/sdl-hello/blob/v4.0/vector2.pas

继续阅读