谈谈父类和子类的隔离性
以前写代码知道要给类外设置访问接口, 例如下例:
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 };
恩.书上的话应该就是上面的代码的也是吧.以后得多多注意啊,然后在无意识中绕过一些坑,别踩进去