2017-05-28 114 views
-4

如何更改(如果可能)类中的值,而在另一个类过程中。例如:德尔福面向对象方法

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; 
+0

这在文档中有解释。你不明白的是哪部分? –

+0

也许您还没有阅读关于[课堂成员可见度]的文档(http://docwiki.embarcadero.com/RADStudio/XE7/en/Classes_and_Objects#Visibility_of_Class_Members) –

+3

您的代码没有显示您所询问的任何内容。你在谈论(大概是)类方法和它们的可见性,但是你的代码根本与类没有关系。另外,它甚至不是有效的语法。 –

回答

0

这取决于。您首先必须考虑可见性分离的原因。 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字段来设置此值,以便不调用其他设置程序代码。

因此总之,答案是否定的。它不是绝对是必需通过访问私人成员类中的获取和设置器。但是,来自外部类,那么是的,这将是必要的。

在另一方面,你可以声明会员strict private下,这将迫使类成员从类本身中可见,而不是从在同一单位其他地方。

Read more here关于班级成员的知名度。

+0

难道你不是指“从单位外”而不是“从课外”:)? Delphi在同一个单元内具有'private'说明符访问孔(可以通过'strict private'指定符来修复)。 – Victoria

+0

因为这不是“必要的”。你可以从同一个单位访问不同班级的私人领域,即使在Delphi的最新版本中,我敢打赌,不是吗? – Victoria

+0

@维多利亚这就是为什么我引用OP的文档来了解更多信息。当然,这里没有必要完整地背诵整个文档。是的,私人成员*可以通过设计从同一单位内访问,但这不被认为是好的做法。 –

0

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, 不一样。