德尔福OOP方法



如何在另一个类过程中更改(如果可能)类中的值。例:

Class1 : Class
Private
Random : Integer;
public
end;
Class2 : Class
Private
Public
Procedure DoSomething();
end;
Procedure Class2.DoSomething();
Begin
//Do Something
If ... then
Change Random to ...
end;

这取决于。您首先必须考虑可见性分离的原因。private方法旨在类内使用,而public方法旨在在类外部使用。

在您的特定示例中,您没有引用类。相反,我将使用您的示例来演示以下内容:

type
TMyObject = class(TObject)
private
FNumber: Integer;
function GetNumber: Integer;
procedure SetNumber(Input: Integer)
public
property Number: Integer read GetNumber write SetNumber;
end;
function TMyObject.GetNumber: Integer;
begin
Result := FNumber;
end;
procedure TMyObject.SetNumber(Input: Integer);
begin
FNumber := Input;
end;

如您所见,我添加了一个名为Number的属性,该属性使用GetNumber来获取值并SetNumber分配它。使用此类方法几乎总是与以这种方式使用属性相结合。

回到你最初的问题,正如我所说,这取决于。例如,属性资源库可能会执行一些额外的代码,而不仅仅是分配值。在这种情况下,在类中,您可能需要改为通过其私有FNumber字段设置此值,以便不调用其他 setter 代码。

所以简而言之,答案是否定的。通过类内的getter 和 setter 访问私有成员并不是绝对必要的。但是,从课外,那么是的,这将是必要的。

另一方面,您也可以在strict private声明成员,这将强制类成员从类本身内部可见,而不能从同一单元中的其他任何地方可见。

在此处阅读有关课程成员可见性的更多信息。

strict privatestrict protected声明部分在D2007中引入。 成员在strict private部分无法从其他类访问,即使在 相同的单位,如以下示例所示:

type
TMyClass = class
private
MyPrivateField : Integer;
strict private
MyStrictPrivateField : Integer;
public
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
MyClass : TMyClass;
begin
MyClass := TMyClass.Create;
MyClass.MyPrivateField := 0;       //  compiles ok
MyClass.MyStrictPrivateField := 1; // does not compile
//  fails with E2361, "Cannot access private symbol TMyClass.MyStrictPrivateField
end;

请注意,这不仅无法编译,而且至少在西雅图,MyStrictPrivateField未显示在 的自动完成列表中 TMyClass(插入点在FormCreate中),与MyPrivateField不同, 确实如此。

最新更新