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