[原創(chuàng)文章歡迎轉(zhuǎn)載,但請(qǐng)保留作者信息] Justin 于 2009-12-09
Item15告訴我們這個(gè)世界是現(xiàn)實(shí)的,有人往左就有人往右。為了保證更多的人能用好你的代碼,在使用對(duì)象管理資源的同時(shí)也要留出接口給那些需要繞過(guò)對(duì)象而直接訪問(wèn)資源的人。(我個(gè)人是不太情愿這樣做……) ??? ? 方法說(shuō)起來(lái)是相當(dāng)?shù)暮?jiǎn)單:寫(xiě)個(gè)函數(shù)暴露出指向資源的指針就可以。書(shū)里講得更多的是用怎樣的函數(shù):
可以實(shí)現(xiàn)一個(gè)get函數(shù),或是*、->運(yùn)算,返回指向資源的指針。這個(gè)叫做顯式轉(zhuǎn)換(explicit conversion) 也可以實(shí)現(xiàn)一個(gè)隱式的轉(zhuǎn)換函數(shù)(implicit conversion),這里要抄一下完整的代碼,僅僅因?yàn)槲覜](méi)有讀過(guò)也沒(méi)有寫(xiě)過(guò)這樣的轉(zhuǎn)換函數(shù)。但是個(gè)人覺(jué)得實(shí)際工作中應(yīng)該是不提倡這樣做的,因?yàn)殡[式的轉(zhuǎn)換極有可能發(fā)生在編程者沒(méi)有意識(shí)的情況下,導(dǎo)致后面的代碼出錯(cuò)。
class?Font?{ public: //??.. //?implicit?conversion?function ??operator?FontHandle()?const?{?return?f;?} //??.. }; 上面代碼的應(yīng)用如下,f本身為Font類(lèi)型,(changeFontSize第一個(gè)參數(shù)為FontHandle),但是由于隱式轉(zhuǎn)換,類(lèi)型變成了FontHandle。
Font?f(getFont()); int?newFontSize; //.. //?implicitly?convert?Font?to?FontHandle changeFontSize(f,?newFontSize);? 回頭看這個(gè)Item的重點(diǎn):做人留一線,日后好相見(jiàn)。為了能兼容更多的API,大師認(rèn)為需要留出接口提供對(duì)資源的直接訪問(wèn)。
|