以前寫代碼知道要給類外設置訪問接口, 例如下例:
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 };
恩.書上的話應該就是上面的代碼的也是吧.以后得多多注意啊,然后在無意識中繞過一些坑,別踩進去
?