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