物件導向開發有三大特性(特點/特徵):封裝,繼承,多型。
在繼承關係的前提下,例項化出不同的物件,這些物件呼叫相同的方法,但是卻表現出不同的行為,這就叫做多型。
在c#語言中體現多型有三種方式:虛方法,抽象類,介面。
// 父類:
public
virtual 返回值型別 方法名(
)// 子類:
public
override 返回值型別 方法名(
)
class
cat:
cattype
}
cat c =
newcat()
;c.method_in_father()
;//呼叫成功,對應第二條第一句
cattype ct =
newcat()
;//賦值成功,對應第一條
ct.cry()
;//呼叫的是重寫後的
c.method_in_father()
;//呼叫成功,對應第二條第二句
c.method_in_son()
;//呼叫失敗,同上,即使他是乙個子類物件賦值過去的
cat c2 =
(cat)ct;
//轉換成功,對應第三句
is
和as
兩個關鍵字都可以進行型別轉換。
is
:如果轉換成功,返回true,失敗返回false;
as
:如果轉換成功,返回對應的物件,失敗返回null。
bool bl = ct is tiger;
//輸出false
bool bl = ct is cat;
//輸出true
if(ct as cat ==
null
)else
//輸出轉換成功
抽象方法的返回值型別前用關鍵字abstract修飾,且無方法體。
abstract
class
npc
抽象方法必須存在於抽象類中。
//父類
abstract
class
npc//子類
class
shopnpc
:npc
子類繼承抽象類,使用override關鍵字重寫父類中所有的抽象方法。
<1>當父類中的方法不知道如何去實現的時候,可以考慮將父類寫成抽象類,將方法寫成抽象方法。
<2>如果父類中的方法有預設實現,並且父類需要被例項化,這時可以考慮將父類定義成乙個普通類,用虛方法實現多型。
<3>如果父類中的方法沒有預設實現,父類也不需要被例項化,則可以將該類定義為抽象類。
inte***ce
ifly
//自動屬性
}
介面注意事項
使用場景對比
學習c (7)多型
一 如果子類定義了父類中原型相同的函式會發生什麼?1 函式重寫 在子類中定義與父類中原型相同的函式 函式重寫只發生在父類與子類之間 2 過載與重寫區別 1 過載 同乙個作用域 子類無法過載父類函式,父類同名函式將被覆蓋 過載是在編譯期間根據引數型別和個數決定 2 重寫 發生於父類 子類之間 父類和子...
C 學習筆記 多型
引言 1.虛繼承 如果乙個派生類從多個基類派生,而這些基類又有乙個共同的基類,則在對該基類中宣告的名字進行訪問時,可能產生二義性。解決方案 虛繼承宣告,加乙個virtual 關鍵字 2.物件導向新需求 編譯器的做法不是我們期望的 如果用父類指標指向子類物件,再呼叫print 方法,均會呼叫父類中的p...
C 多型學習筆記
看了一堆介紹多型的東西,腦子裡就記得幾個概念了。靜態多型,又叫早繫結,動態多型,應該是叫晚繫結。多型的價值在於使程式更簡潔 更高效。no virtual no 多型,virtual means 已多型。不要覺得問題 很沒用 你還就是說不出來。同樣的命令,不同的物件,做出不同的動作。這就得借助the ...