overload就是過載,大家都會。但是大家有沒有想過,我們呼叫乙個過載方法的時候會呼叫哪個呢??
答案是和簽名最接近的乙個。
大家是不是看到這裡已經開始覺得這個部落格很無聊了,都是這麼簡單的內容。沒關係,我們慢慢深入。
我們知道方法為了能夠減少書寫個數, 提供了乙個叫預設引數的東西
voidp(
object p1,
bool p2 =
true
)
這樣我們可以通過p(p1)
或者p(p1true)
兩種方式來進行呼叫
如果我們這個時候的過載情況時這樣的
voidp(
object p1)
voidp(
object p1,
bool p2 =
true
)
此時再呼叫,p(p1)
執行的是上乙個函式。一種理解方式是,第二個方法比第乙個能夠多處理一種情況p(p1,true)
。所以我們專事專用,選擇更具體的方法。
ok.c#作為乙個oo語言,還有乙個特點就是繼承,這個同樣反映在方法裡
voidp(
object p1)
對於上述方法,可以使用object
作為引數,也可以使用更加具體的object
子類
那麼如果我們的過載情況時這樣的
voidp(
object p1)
void
p(exception p1)
那麼如果我們傳入的引數是exception
或者是exception
的子類,那麼執行第二個,如果是exception
的父類或者其他object
的派生類,則執行的是第乙個函式
同樣的思路,如果執行p(new exception())
時第二個函式,更加具體或者說更加"專業"
那麼重點來了,在如下的條件下,執行p(null)
,輸出時什麼?
voidp(
object p1)
void
p(exception p1,
bool p2 =
true
)
不知道了是吧,那我們換成p(new exception())
。第一反應是不是應該輸出"第二個"。沒錯,微軟也是這麼做的。我們這麼想,p2
涉及的狀態只有有和無兩種。而繼承涉及的狀態多如牛毛
所以在函式簽名匹配時繼承高於預設引數
那麼我們回來看p(null)
的輸出
恩,是不是還是啥都不知道。沒錯這邊涉及null
應該是更加具體,還是更加抽象。
其實我也不知道,於是就做了demo測試,結果是輸出"第二個"
所以我們從現象反推,我們可以這麼想null
可以為所有object
物件賦值,所null
更具體
ok,那我們需要輸出"第乙個"是咋辦咧,可以使用強轉p((object)null)
不過目前我這邊沒有找到任何確定文件表明這乙個特性,所以有可能是編譯器未定義的行為,所以不建議大家隨意使用
本文會經常更新,請閱讀個人部落格原文: ,以避免陳舊錯誤知識的誤導,同時有更好的閱讀體驗。
繼承和過載
繼承的目的 實現 重用 派生的目的 當新的問題出現原有程式無法解決 或不能完全解決 時,需要對原有程式進行改造 1 當建立乙個類時,您不需要重新編寫新的資料成員和成員函式,只需指定新建的類繼承了乙個已有的類的成員即可。這個已有的類稱為 基類,新建的類稱為 派生類。2 乙個類可以派生自多個類,這意味著...
c和obj c如何混用
1 obj c的編譯器處理字尾為m的檔案時,可以識別obj c和c的 處理mm檔案可以識別obj c,c,c 但cpp檔案必須只能用c c 而且cpp檔案include的標頭檔案中,也不能出現obj c的 因為cpp只是cpp。2 在mm檔案中混用cpp直接使用即可,所以obj c混cpp不是問題 ...
c和obj c如何混用?
1 obj c的編譯器處理字尾為m的檔案時,可以識別obj c和c的 處理mm檔案可以識別obj ccc 但cpp檔案必須只能用c c 而且cpp檔案include的標頭檔案中,也不能出現obj c的 因為cpp只是cpp 2 在mm檔案中混用cpp直接使用即可,所以obj c混cpp不是問題 3 ...