我最近一直在编写不同的类,我注意到我无意中使用 field
来读取/写入它们。和property
标识符,我想知道如果这样做的话会有什么陷阱?
让我们以一个基本类为例:
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
我的意思是标识符,例如 FName
和FID
,以及property
我的意思是 Name
标识符和ID
例如。
发布的全部目的property
如果我没有记错的话,就是能够在编写类的单元之外访问它。这肯定意味着 field
标识符应该在类编写的单元中使用,毕竟你无法访问那些 field
类外的标识符。
这是我注意到在某些程序(私有(private)或 protected )中我没有使用 FName
的地方。或FID
,而是使用 property
等效,Name
和ID
- 或有时混合。
到目前为止,我还没有发现任何问题,事实上我通常会使用 FName
和FID
但就像我说的,由于某种原因无意中没有这样做。
这是不好的做法还是会导致更险恶的事情?
谢谢。
最佳答案
属性的目的不是允许访问类本身之外的类数据。
这可以通过将您的成员(member)数据声明为公开来轻松完成。
属性的目的是促进良好的 OOP。
以下几点说明了这个概念。
副作用
属性的主要目的是隐藏类的实现细节并在设置属性时允许“副作用”。
这在 VCL 中很明显,由于 SetHeight Setter 中编码的副作用,更改 height
属性将自动更改窗口的外观。
这是 information hiding OOP 概念的一部分.
无论您是否在类里面,这些副作用都很有用。
当您的类或其后代之一更改属性的行为时,另一个有用的方面就会发挥作用;添加以前没有的副作用。
如果原始类中的旧代码直接修改字段,这些副作用将不会触发,从而破坏后代内部的更改。
经验法则:副作用
始终使用该属性,除非您明确希望防止触发副作用。 !!记住 setter/getter 也可能有副作用。
实现隐藏
有时,这些字段并不是其在属性中的外观的直接翻译。
或者您可能想更改底层的实现,但保持属性不变。
同样,在这种情况下,您可能也想在自己的类中隐藏这些详细信息,以便后代类不会中断。
例如如果您将存储实现为带有指针的红/黑树,那么当您决定切换到基于数组的偏移结构时,您希望尽量减少对例程其余部分的影响。
经验法则:隐藏实现
仅直接访问这些直接处理数据的例程中的字段。
通过放置通用例程来限制这些例程的数量,例如:定位器、迭代器等。
关于delphi - 我应该引用字段或属性名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19058689/