我应该引用字段或属性名称吗?

时间:2013-09-27 19:31:58

标签: delphi freepascal lazarus

我最近一直在写不同的课程,我注意到我无意中使用fieldproperty标识符读取/写入了它们,我想知道如果有的话会有什么陷阱这样做?

让我们使用基础类作为例子:

TMyClass = class
private
  FName: string;
  FID: Integer;
public
  constructor Create(AName: string);
  destructor Destroy; override; 
published
  property Name: string read FName write FName;
  property ID: Integer read FID write FID;
end;

我的意思是field标识符,例如FNameFID,以及property标识符,我的意思是NameID

如果我没有弄错的话,已发布的property的整个目的是能够在写入类的单元之外访问它。这肯定意味着应该在编写类的单元中使用field标识符,毕竟您无法访问类外的field个标识符。

这是我注意到的一些程序(私有或受保护)我没有使用FNameFID,而是使用了property等价物,{ {1}}和Name - 或有时混合。

到目前为止,我没有看到任何问题,事实上我通常会使用IDFName,但就像我说的那样,由于某种原因无意中没有这样做。

这是不好的做法还是会导致更险恶的事情?

感谢。

1 个答案:

答案 0 :(得分:6)

属性的目的,以允许访问类本身之外的类数据。
这可以通过将您的会员数据声明为公开来轻松完成。

财产的目的是促进良好的OOP 以下几点说明了这一概念。

副作用
属性的主要目的是隐藏类的实现细节,并在设置属性时允许“副作用” 这在VCL中很明显,由于SetHeight Setter中编码的副作用,更改height属性会自动更改窗口的外观。
这是OOP概念information hiding的一部分。

无论您是否在课堂内,这些副作用都很有用 当您的类或其后代之一更改属性的行为时,另一个有用的方面就会启动;在之前没有的情况下添加副作用。
如果原始类中的旧代码直接使用字段,则这些副作用将不会触发,从而打破了后代内部的更改。

经验法则:副作用
始终使用该属性,除非您明确要防止副作用被触发。 !!记住吸气剂也有副作用。

隐藏实施
有时,这些字段不是他们在房产中出现的直接翻译 或者您可能希望更改引擎下的实现,但保持属性相同 同样在这种情况下,您可能也想在自己的类中隐藏这些细节,以便后代类不会中断 例如如果您将存储实现为带有指针的红色/黑色树,那么当您决定切换到基于阵列的偏移结构时,您希望最小化对例程其余部分的影响。

经验法则:实施隐藏
只能在这些直接处理数据的例程中直接访问字段 通过放置通用例程来限制这些例程的数量,例如:locaters,iterators等。