我试图在Free Pascal中的类声明中定义类方法,我还没有找到任何在线示例。目前我必须这样做:
unit Characters;
{$mode objfpc}{$H+}
// Public
interface
type
TCharacter = class(TOBject)
private
FHealth, FAttack, FDefence: Integer;
procedure SetHealth(newValue: Integer);
public
constructor Create(); virtual;
procedure SayShrek();
function GetHealth(): Integer;
published
property Health: Integer read GetHealth write SetHealth;
end;
// Private
implementation
constructor TCharacter.Create;
begin
WriteLn('Ogres have LAYERS!');
end;
procedure TCharacter.SayShrek;
begin
WriteLn('Shrek!');
end;
procedure TCharacter.SetHealth(newValue: Integer);
begin
FHealth:= FHealth + newValue;
end;
function TCharacter.GetHealth() : Integer;
begin
GetHealth:= FHealth;
end;
end.
有没有办法让这个更干净一点?在其他地方定义一切看起来很乱,而且没有组织。
为了澄清,我想按照以下方式做点什么:
TMyClass = class(TObject)
public
procedure SayHi();
begin
WriteLn('Hello!');
end;
end;
而不是必须进一步定义它。这可能吗?
答案 0 :(得分:3)
不,你不能这样做。 Pascal 从一开始就有一个单通道编译器是为单通道编译而设计的,因此在声明它之前你不能使用它。
作为伪代码的一个简单示例:
MyClass = class
procedure MethodA;
begin
MethodB; <== At this point the compiler knows nothing about MethodB
end;
procedure MethodB;
begin
end;
end;
这就是为什么每个单元至少有两个部分:interface
(声明,您可以将其视为关于C ++头文件)和implementation
。
但是,在实现循环声明的语言语法中有一些技巧可以使用前向声明。
指针:
PMyRec = ^TMyRec; // Here is TMyRec is not declared yet but compiler can to handle this
TMyRec = record
NextItem: PMyRec;
end;
对于班级:
MyClassA = class; // Forward declaration, class will be fully declared later
MyClassB = class
SomeField: MyClassA;
end;
MyClassA = class
AnotherField: MyClassB;
end;
在IDE中,您可以使用Shift+Ctrl+Up/Down
键在项目的声明和实现之间进行导航。
答案 1 :(得分:3)
在Pascal中这是不可能的。它的语法是不允许的。
Pascal的一个基本设计是,单位分为interface
(可以做什么?)和implementation
(如何完成?< / em>的)。
在解析interface
部分之前,编译器会读取所有implementation
个部分。你可能从C语言中知道这一点。 implementation
可以描述为* .c文件,而interface
相当于C中的* .h文件。
此外,此类代码会严重降低interface
部分(f.i.类声明)的可读性。
您希望获得哪些好处?