1

我开始使用面向对象的方法来探索 Pascal。我想知道是否存在对当前对象的this或引用?self我四处寻找文档,但没有找到答案。

编辑
通过反复试验我发现您可以使用self. 现在我的问题是我可以在编译器不抛出“重复标识符错误”的情况下实现这一点(下面的片段)吗?

constructor Employee.create(name:String; salary:Real);
begin
  self.name := name;
  self.salary := salary;
end;

我有一个下面的程序,它创建 2 名员工并显示他们的信息

{$mode objfpc} // directive to be used for defining classes
{$m+}          // directive to be used for using constructor

program EmployeeTest;
type
  Employee = class
  private
    name:String;
    salary:Real;
  public
    constructor create(name:String; salary:Real);
    procedure setName(name:String);
    function getName():String;
    procedure setSalary(salary:Real);
    function getSalary():Real;
    procedure displayEmployee;
end;

var empl1,empl2:Employee;

constructor Employee.create(name:String; salary:Real);
begin
  setName(name);
  setSalary(salary);
end;

procedure Employee.setName(name:String);
begin
  self.name := name;
end;

procedure Employee.setSalary(salary:Real);
begin
  self.salary := salary;
end;

function Employee.getName():String;
begin
  getName := self.name;
end;

function Employee.getSalary():Real;
begin
  getSalary := self.salary;
end;

procedure Employee.displayEmployee;
begin
  writeln('Name: ',getName,', Salary: $',getSalary:0:2);
end;

begin
  empl1 := Employee.create('Bob', 75000);
  empl2 := Employee.create('Joe', 50000);
  empl1.displayEmployee();
  empl2.displayEmployee();
  readln; {pause}
end.
4

2 回答 2

3

没想到我会回答我的问题。

在这里找到了答案。

如果要在嵌套函数中重复变量名称,则必须使用{$mode delphi}而不是。{$mode objfpc}

于 2012-12-30T03:22:25.513 回答
2
  1. 不要为参数和属性使用相同的名称。使用前缀 A 作为参数。
  2. 不要实现 getter 和 setter 方法。在 Pascal 中使用 property 关键字。
  3. 对私有字段使用前缀 F。
  4. 对自定义类型使用前缀 T。

这是您班级的示例:

type
  TEmployee = class(TObject)
    private
      FName: String;
      FSalary:Real;
    public
      constructor Create(AName:String; ASalary:Real);
      property Name: String read FName write FName;
      property Salary: Real read FSalary write FSalary;
      procedure DisplayEmployee;
  end;


constructor TEmployee.Create(AName:String; ASalary:Real);
begin
  inherited Create;
  FName := AName;
  FSalary := ASalary;
end;

procedure TEmployee.DisplayEmployee;
begin
  WriteLn('Name: ', FName, ', Salary: $', FSalary:0:2);
end;
于 2012-12-30T12:12:29.557 回答