C++程序设计之类的属性

__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区)。

 

posted @ 2016-02-14 14:19  hbg200  阅读(231)  评论(0编辑  收藏  举报