我最近一直在写不同的课程,我注意到我无意中使用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
个标识符。
这是我注意到的一些程序(私有或受保护)我没有使用FName
或FID
,而是使用了property
等价物,{ {1}}和Name
- 或有时混合。
到目前为止,我没有看到任何问题,事实上我通常会使用ID
和FName
,但就像我说的那样,由于某种原因无意中没有这样做。
这是不好的做法还是会导致更险恶的事情?
感谢。
答案 0 :(得分:6)
属性的目的是不,以允许访问类本身之外的类数据。
这可以通过将您的会员数据声明为公开来轻松完成。
财产的目的是促进良好的OOP 以下几点说明了这一概念。
副作用
属性的主要目的是隐藏类的实现细节,并在设置属性时允许“副作用”
这在VCL中很明显,由于SetHeight Setter中编码的副作用,更改height
属性会自动更改窗口的外观。
这是OOP概念information hiding的一部分。
无论您是否在课堂内,这些副作用都很有用
当您的类或其后代之一更改属性的行为时,另一个有用的方面就会启动;在之前没有的情况下添加副作用。
如果原始类中的旧代码直接使用字段,则这些副作用将不会触发,从而打破了后代内部的更改。
经验法则:副作用
始终使用该属性,除非您明确要防止副作用被触发。 !!记住吸气剂也有副作用。
隐藏实施
有时,这些字段不是他们在房产中出现的直接翻译
或者您可能希望更改引擎下的实现,但保持属性相同
同样在这种情况下,您可能也想在自己的类中隐藏这些细节,以便后代类不会中断
例如如果您将存储实现为带有指针的红色/黑色树,那么当您决定切换到基于阵列的偏移结构时,您希望最小化对例程其余部分的影响。
经验法则:实施隐藏
只能在这些直接处理数据的例程中直接访问字段
通过放置通用例程来限制这些例程的数量,例如:locaters,iterators等。