天天看點

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

繼續閱讀