Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
delphioop方法_Oop_Delphi - Fatal编程技术网

delphioop方法

delphioop方法,oop,delphi,Oop,Delphi,如果可能的话,我如何在另一个类过程中更改一个类中的值。例如: 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; 视情况而定。首先必须考虑

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

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;

视情况而定。首先必须考虑可见性被分离的原因。私有方法用于类内,而公共方法用于类外

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

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访问私有成员并不是绝对必要的。然而,从课外来说,是的,这是必要的

另一方面,您还可以将该成员声明为严格私有,这将强制该类成员只能从类本身中看到,而不能从同一单元中的任何其他位置看到

关于类成员的可见性。

严格私有和严格保护 declarationsection是在D2007中引入的。在会议上宣布的成员 严格的私有部分不能从其他类访问,即使在 相同的单位,如本例所示:

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;
请注意,这不仅无法编译,而且至少在西雅图, MyStrictPrivate字段未显示在的自动完成列表中 与MyPrivateField不同,在FormCreate中具有插入点的TMyClass,
确实如此。

文档中对此进行了解释。您不了解其中的哪一部分?可能您还没有阅读有关代码的文档,也没有说明您所询问的任何内容。您可能在谈论类方法及其可见性,但您的代码与类完全无关。还有,它甚至不是有效的语法。@DavidHeffernan我不懂的东西更具体,但我想如果我学会了基本知识,它会有所帮助。我真正想知道的是,如果我有两个类,c1和c1,我在c1里面。举个例子,我怎么能改变c2中的值。我能这样做吗?这对我来说毫无意义,你是说从单元之外而不是从课堂之外:?Delphi在同一个单元中有一个私有说明符访问孔,它可以由严格的私有说明符来修复,因为它不是必需的。您可以从同一单元访问不同类的私有字段,即使是在最新版本的Delphi中,我打赌,不是吗?@Victoria这就是我参考OP文档了解更多信息的原因。当然,这里没有必要完全背诵整个文档。是的,私人成员可以通过设计从同一个单元中访问,但这不是好的做法。当然。我同意从同一单元中的另一个类访问字段是没有好处的。这种欺骗仍然很有用,例如,对于隐藏子组件(如网格头)的方法,这些子组件应该对用户保持隐藏,例如CalcHeaderRect方法,这些方法只从网格调用,而不是由用户调用。O。。K有人能解释一下为什么他们把赞成票变成反对票吗?