这里
? propertyName是任何有效标志符;
? [indexes]是可选的,它是用分号隔开的参数声明序列,每个参数声明具有如下形式:identifier1, ...,
identifiern: type。更多信息请参考Array properties;
? type必须是内置的或前面声明的数据类型,也就是说,像property Num: 0..9 ...这样的属性声明是非
法的;
- 108 -
Classes and objects
index integerConstant子句是可选的。更多信息请参考Index specifiers;
specifiers是由read、write、stored、default(或nodefault)和implements限定符组成的序列。每个属性声明必须至少包含一个read或write限定符。
属性由它们的访问限定符定义。不像字段,属性不能作为var参数传递,也不能使用@运算符,原因是属性不一定(是不一定,还是一定不呢?)在内存中存在。比如,它可能有一个读方法从中检索一个值或者产生一个随机数值。 ? ?
Property access(属性访问)
每个属性有一个读限定符,一个写限定符,或两者都有,它们称为访问限定符,具有以下的格式 read fieldOrMethod
write fieldOrMethod
这里,fieldOrMethod是一个字段或方法名,它们既可以和属性在同一个类中声明,也可以在祖先类中声明。
? 如果fieldOrMethod和属性是在同一个类中声明的,它必须出现在属性声明的前面;
类中声明的,则它对派生类必须是可见的,也就是说,若祖先类在不同的单元声明,
不能是私有的字段或方法;
? 若fieldOrMethod是一个字段,它的类型和属性必须相同;
? 若fieldOrMethod是一个方法,它不能是重载的,而且,对于公布的属性,访问方法必须使用默认的
register调用约定;
? 在读限定符中,若fieldOrMethod是一个方法,它必须是一个不带参数的函数,并且返回值和属性具
有相同的类型;
? 在写限定符中,若fieldOrMethod是一个方法,它必须是一个带有单一值参(传值)或常量参数的过
程,这个参数和属性具有相同的类型;
比如,给定下面的声明
property Color: TColor read GetColor write SetColor;
GetColor方法必须被声明为:
function GetColor: TColor;
SetColor方法必须被声明为下面之一:
procedure SetColor(Value: TColor);
procedure SetColor(const Value: TColor);
(当然,SetColor的参数名不必非得是Value。)
当在表达式中使用属性时,通过在读限定符中列出的字段或方法读取它的值;当在赋值语句中使用属性时,通过写限定符列出的字段或方法对它进行写入。
在下面的例子中,我们声明了一个叫做TCompass的类,它有一个公布的属性Heading。
过FHeading字段读取,写入时使用SetHeading过程。
type
THeading = 0..359;
TCompass = class(TControl)
private
FHeading: THeading;
procedure SetHeading(Value: THeading);
published
property Heading: THeading read FHeading write SetHeading;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23665-80.html
还是忍
应该是美国人都不是好东西
等上面看穿了