在类声明中定义方法体?

时间:2015-08-20 03:06:04

标签: pascal lazarus freepascal delphi

我试图在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;

而不是必须进一步定义它。这可能吗?

2 个答案:

答案 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.类声明)的可读性。

您希望获得哪些好处?