谈谈父类和子类的隔离性

以前写代码知道要给类外设置访问接口, 例如下例:

 1 class Money
 2 {
 3 public:
 4       Money(int money) : m_curValue(money){}
 5       
 6       void store(int money) { m_curValue += money;}
 7       void spent(int money){ m_curValue -= money;}
 8 private:
 9    int m_curValue; 
10 };
11 
12 int main(int argc, char** argv)
13 {
14     Money myMoney(100);
15     myMoney.store(100);    //通过Money类的访问接口开存取钱, 而不能直接操作前
16     myMoney.spent(50);
17     return 0;
18 }

但是呢,从未关注过父类和子类也要通过接口沟通.

书上的话:
//
派生类可以直接访问基类的包含数据成员,甚至在构造时初始化它们,但是一般不这么做,而是通过基类的接口(成员函数)去访问它们,初始化也是通过基类的构造函数.
//这样做的好处是,一旦基类的实现有错误,只有不涉及接口,那么基类的修改不会影响派生类的操作.
//类和类直接,你做你的,我做我的,以接口作沟通.即使基类和派生类也不类外.这正是类能够发挥其生命力的原因所在

 

例如:

 

 1 class Father
 2 {
 3 public:
 4     Father(string firstNm, string SecondNm = "大毛") : m_firstNm(firstNm), m_secondNm(secondNm)
 5     {
 6      }
 7     
 8     string getFistName(){return m_firstNm;}
 9 
10 protected:
11    string m_firstNm;
12 private:
13    string m_secondNm;
14 };    
15 
16 class Son : public Father
17 {
18 public:
19      Son(string FirstNm, string SecondNm) : Father(FirstNm), m_secondName(SecondNm)
20      {
21      }
22 //下面的函数直接使用了基类的包含成员的函数 是不好的风格
23      bool isFirstName(string givenNm)
24       {
25              return m_firstNum == givenNm ? true : false;
26       }
27 //下面的函数通过接口使用,才算是比较好的风格
28      bool isFirstName(string givenNm)
29       {
30              return getFirstName() == givenNm ? true : false;
31       }
32 private:
33     string m_secondName;
34 };

恩.书上的话应该就是上面的代码的也是吧.以后得多多注意啊,然后在无意识中绕过一些坑,别踩进去

 

posted @ 2016-06-04 17:25  哈哈不是嘎嘎  阅读(254)  评论(0编辑  收藏  举报