2009年11月5日 星期四

由private進public易,由public入private難~

昨天看到一篇有趣的菜鳥vs.老鳥文,後來發現Dr. Dobb’s也有,這個小class有許多重要觀念與巧思,值得玩味再三,我”直覺”還有許多自己不明瞭的細節在這class中。看起來像是某本書翻來的(否則就是貼文作者文筆太好拉),真應該找來看看。


先討論我目前看到的疑點,感覺do_write()放在protected很合理,也常常在很多code看到這樣的style,把write()放在public,把實作的細節留在protected中,也給了繼承自己的人,額外實作細節的空間。不是很能體會的是原文中的
因爲調用它們的時候必須以一種特定的方式進行。比如do_write()函數,必須先把類型資訊寫入,再把物件資訊寫入,這樣讀取的時候,負責生成物件的模組首先能夠知道要讀出來的物件是什麽類型的,然後才能正確地從流中讀取物件資訊。
這句話是指說他強烈的希望進來的資料可以過一手給write()處理嗎?否則以”讀取的正確性”而言,好像只是過一手把同樣的參數傳給do_write()跟do_read(),從這個角度來看,就算把他們放到public也好像沒甚麼不可以?

7 則留言:

  1. 我也好想當Wendy的小菜鳥喔~

    回覆刪除
  2. 回到主題~

    do_read/do_write 是read/write的部份實現,並且允許被override,這是很典型的Template Method Pattern。換句話說do_read/do_write很可能只能在read/write裡的適當時機被呼叫才能正常運作(例如:Dudley << classID() << std::endl;之後),所以設計者不希望do_read/do_write在其它時機,讓其它人任意調用,於是乎將其放在protected裡。


    "好像只是過一手把同樣的參數傳給do_write()跟do_read()"


    其實不單單過一手把同樣的參數傳給do_write()跟do_read(),舉個例子:
    假設要實現一件事,要三個步驟A,B,C ,於是乎產生下列實作

    void do_somthing(void)
    {
    A();
    B();
    C();
    }
    此時,若B這個步驟會因不同subclass而異,而A,C皆為不變的例行公事,我們r就可以將B變成一個virtual function好讓subclass可以override。這就是Template Method的精髓。

    回覆刪除
  3. 肯~原來是翻譯文~Orz 一開始沒注意~害我對Wendy心存遐想

    回覆刪除
  4. 譯者他有另外一個關鍵沒提到
    Wendy:"Now explain to me why do_write and do_read are not private."

    Apprentice:"Because the derived class has to call its parent class's implementation of those functions so that the parent class has a chance to read and write its data."

    回覆刪除
  5. 我一直覺得我不是很能完全體會這些東西。。。也許等我把c++複習一次會比較好吧orz

    回覆刪除
  6. 一起追尋心目中的那個wendy 吧!!! >/////<

    回覆刪除
  7. 欠是我們的Wendy~~ >/////<

    回覆刪除