__property是属性关键字,用来定义类的某种属性。是Borland为C++Builder类的扩充。目的是简化操作,加强对函数成员封装,举例说明,对于没有属性的类如下:
class TMyClass
{
private:
int data;
public:
int GetData() { return data; }
void SetData(int iData) { data = iData; }
};
TMyClass MyClass;
int myData;
myData = MyClass.GetData(); //读函数成员方法
MyClass.SetData(myData); //写函数成员方法
对于有属性的类如下:
class TMyClass
{
private:
int Fdata;
int GetData() { return Fdata; }
void SetData(int iData) { Fdata = iData; }
public:
__property int Data = {read = GetData, write = SetData};
};
TMyClass MyClass;
int myData;
myData = MyClass.Data; //读属性成员方法
MyClass.Data = myData; //写属性成员方法
只引出Data属性成员,对GetData,SetData函数成员进一步封装,简化了对外接口,并且用变量的等式操作,简化了书写复杂性。
读写控制,实现只读或只写:
class TMyClass
{
private:
int Fdata;
int GetData() { return Fdata; }
void SetData(int iData) { Fdata = iData; }
public:
__property int OnlyReadData = {read = GetData};//只读属性
__property int OnlyWriteData = {write = SetData};//只写属性
};
TMyClass MyClass;
int myData;
myData = MyClass.OnlyReadData; //只读属性成员方法
MyClass.OnlyWriteData = myData; //只写属性成员方法
属性实现原理:通过保留字__property说明后部分为属性格式。其中的read,write为读写触发保留字。可读写两种类型数据,分别为变量类成员,包括数组、结构类成员。另一类为函数成员。通过属性数据Data传递给写形参iData,即iData = Data,或Fdata = Data,实现数据传入,写入格式为MyClass.Data = 写入属性的数据变量。读属性函数必须是特定格式:返回同属性相同类型 GetData(必须是void) { return 返回要读的内容; },读出属性的数据变量 = GetData(必须是void) { return 返回要读的内容; },或读出属性的数据变量 = Data = Fdata。与属性变量传递数值的成员变量必须同属性变量类型相同。属性的操作部分一般都在私有部分实现,只引出属性定义。
隐藏对组合类成员的访问:
class TDraw
{
public:
unsigned int dwBGColor,//背景颜色
dwFillColor,//矩形填充颜色
dwTextColor,//文本颜色
dwLineColor;//线类颜色
int iFontSize;//字体大小
};
class TCRect : public TControl //继承Windows控件自画矩形
{
public:
__property DWORD dwBGColor = {read = GetBGColor, write = SetBGColor};//背景颜色属性
private:
TDraw Draw;//在控件上绘图
DWORD __fastcall GetBGColor(void);//获取背景颜色
void __fastcall SetBGColor(DWORD vBGColor);//设置背景颜色
};
DWORD __fastcall TCRect::GetBGColor(void)//获取背景颜色
{
return Draw.dwBGColor;
}
void __fastcall TCRect::SetBGColor(DWORD vBGColor)//设置背景颜色
{
Draw.dwBGColor = vBGColor;
}
TCRect CRect;
CRect.dwBGColor = MyColor;//设置背景颜色
MyColor = CRect.dwBGColor;//读取背景颜色
避免了CRect.Draw.dwBGColor推代式的操作(需要将TDraw Draw移到public区),或CRect.SetBGColor(MyColor) 无属性操作(需要将SetBGColor移到public区)。