先討論我目前看到的疑點,感覺do_write()放在protected很合理,也常常在很多code看到這樣的style,把write()放在public,把實作的細節留在protected中,也給了繼承自己的人,額外實作細節的空間。不是很能體會的是原文中的
因爲調用它們的時候必須以一種特定的方式進行。比如do_write()函數,必須先把類型資訊寫入,再把物件資訊寫入,這樣讀取的時候,負責生成物件的模組首先能夠知道要讀出來的物件是什麽類型的,然後才能正確地從流中讀取物件資訊。這句話是指說他強烈的希望進來的資料可以過一手給write()處理嗎?否則以”讀取的正確性”而言,好像只是過一手把同樣的參數傳給do_write()跟do_read(),從這個角度來看,就算把他們放到public也好像沒甚麼不可以?
我也好想當Wendy的小菜鳥喔~
回覆刪除回到主題~
回覆刪除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的精髓。
肯~原來是翻譯文~Orz 一開始沒注意~害我對Wendy心存遐想
回覆刪除譯者他有另外一個關鍵沒提到
回覆刪除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."
我一直覺得我不是很能完全體會這些東西。。。也許等我把c++複習一次會比較好吧orz
回覆刪除一起追尋心目中的那個wendy 吧!!! >/////<
回覆刪除欠是我們的Wendy~~ >/////<
回覆刪除