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