《實踐》從「打死也不繼承」開始

2021-06-05 12:41:51 字數 1243 閱讀 4819

寫乙個小介面工具「imageruler」,遇到乙個問題。有三種型別的參考線,其中「邊界參考線」與「框參考線」行為基本一致,「按鈕參考線」的行為有所不同,我已經將這兩種型別抽象成struct,方便使用。他們都有「setline」和「findnearline」這兩種操作。

areaborder m_border; 

//邊界參考線

buttonsplitlines m_buttonlines; 

//按鈕參考線

areaborder m_framelines; 

在進行「setline」和「findnearline」操作時,如果上層必須知道對哪一種型別的東西進行操作,就必須寫switch語句,造成重複**。去掉這種重複,最明顯的思路就是「繼承」,因為他們介面類似,所以繼承以後,上層就直接呼叫方法,而不管具體型別是什麼了。

no!areaborder和buttonsplitlines這兩種型別是我自己設計的,我自認為他們的相似程度,還不夠達到共用介面的程度!如果繼承自同乙個介面,就可能要面對有一些類似,關鍵地方又不同的窘境。

在這裡,打死我也不繼承。

思來想去,用了一種很樸實的辦法,將操作封裝起來。

enum

int modeoperate( int imode, int ioperatetype, void* pdata );

引數1 imode,是選擇一種參考線,引數2是選擇一種操作,引數3是可變的引數。上層受點累,需要把列舉值傳進來(如果真覺得累,封個getmode()函式,就行啦)。

modeoperate(...)的實現,通過switch-case對每一種情況寫上**就行。用函式把重複的操作去掉,樸實而簡潔。

——————————————————————————————————

c++的毛病,與go語言(還有一些好的動態語言)的區別,用我自己的話說是這樣:

我是乙個程式設計師,我有coding()的方法,於是我繼承自cprogrammer。因為我還是乙個發燒友兼拳皇玩家,我會enjoymusic()和playkof98(),那我需要多重繼承一下chifier和ckofer。

這樣我認為不對。如果用組合代替繼承如何?將不同的「操作類」組合到我的大腦裡。感覺真彆扭。

go語言與一些我不大會用的動態語言,提供了一種叫做「duck type」的特性,如果我會coding(),那麼就可以把我當成programmer使用,不需要我coding()的時候,我就去playkof98(),我不會受任何一種基類的制約,也不需要實現我不喜歡的方法,需要我做什麼的時候,我就變成需要的那種人(如果我能變)。

打死我也不說!

梗 最好的密電碼是啥?是 打死我也不說!這樣,即使幫我們傳送密電碼的豬隊友被敵人抓住嚴刑拷打,我們也不用擔心洩露秘密。現在稍微改進一下,我們把 打死我也不說 的拼音首字母 dswybs 藏在乙個矩陣裡,而代表 打 的字母d和代表 說 的字母s所在的行列下標之和即是密碼。對於給定的矩陣,請判斷其中是否...

雲計算 打死也不能說的九大謊言

廠商的炒作,加上it人的自欺,很快就會讓人們對某種技術感到失望。如果你正在考慮雲計算戰略的話,請千萬別被這些虛偽的承諾所迷惑。如今,無論你去 都會有人對你說,或者向你兜售和雲計算有關的什麼東東。而你只有剝去其謊言的外衣,還其本來面目,你才能夠了解雲計算是否真的適合於你的企業。下面就是我們列出的關於雲...

企業老總 打死也不招應屆大學畢業生!

企業老總 打死也不招應屆大學畢業生!很多大學畢業生找不到工作,覺得社會騙了他,書本騙了他,每天怨天怨地的。說起開除,我已經很有經驗了,對這幫大學生,我是一開除就當場請他清理辦公桌。大學生心理不穩定,什麼都不懂,但是對於找工作到是很熱情的,當然我從不反對他們尋找更好的工作,只是比如有幾次,乙個大學生剛...