一、對於繼承自同一基類的多個不同派生類的例項,在執行時可以將它們賦值給基類型別的變數,訪問該變數的同乙個成員會根據該變數執行時型別的不同而產生不同的行為,這個特性即被稱為多型(polymorphism);多型允許以同一種方式訪問同乙個變數的成員而產生不同的行為;
1.在c#中,每個型別都是多型的,因為包括自定義型別在內的所有型別都繼承自基類system.object;
2.虛成員、抽象成員和重寫成員、替換成員是多型的基礎;
3.非抽象基類中可以將方法、屬性、事件和索引器宣告為虛成員並實現,抽象基類中可以將這些成員宣告為抽象成員而不實現,派生類中可以通過override關鍵字重寫這些虛成員或抽象成員提供差異化實現,這樣會代替基類中的虛成員,此時無論在**中呼叫編譯時型別為基類或派生類的變數的成員,在執行時clr都會根據變數的執行時型別是基類或派生類來判斷呼叫基類中的原成員或派生類中的重寫成員;
4.如果不想讓基類中的虛成員被代替,則應該在派生類中通過new關鍵字隱藏此虛成員並提供新的實現,此時在**中呼叫編譯時型別為基類的變數的成員,在執行時clr會呼叫基類中該方法的實現;在**中呼叫編譯時型別為派生類的變數的成員,在執行時clr會呼叫派生類中該方法的實現;
publicclass
animal
}public
class
cat : animal
}public
class
dog : animal
}
使用方式:
new cat().call(); //miao~
new dog().call(); //
wang~
list
animals = new list()
; //
此處使用了隱式轉換,將派生類物件隱式轉換為基類變數
for (int i = 0; i < animals.count; i++)
5.通過隱式轉換將派生類例項賦值給基類變數,再將該基類變數引用的物件通過顯式轉換或as運算子轉換後賦值給派生類變數,此時該派生類變數引用的物件的所有資料和行為較最初的派生類例項相比不會發生任何改變,實際上,類的例項在型別轉換過程中其型別不會發生任何改變,只是在呼叫過程中會根據引用該例項的變數的編譯時型別執行不同的呼叫方式,會優先查詢例項中變數的編譯時型別所對應的實現;
classbaseclass
public
virtual
void
method2()
}class
derivedclass : baseclass
public
newvoid
method2()
}
使用方式:
derivedclass derivedobj = new derivedclass() ;baseclass baseobj = new
baseclass();
console.writeline(derivedobj
is baseclass); //
true
console.writeline(baseobj is derivedclass); //
false
derivedobj.method1(); //
derived_method1
derivedobj.method2(); //
derived_method2
//將派生類物件隱式轉換為基類物件
baseobj =derivedobj;
//此時baseobj中存的依然是原來的derivedclass的例項,通過反射即可得知
type mytype =baseobj.gettype();
console.writeline(mytype.name);
//derivedclass
console.writeline(mytype.getfield("
mynum
").getvalue(baseobj)); //
1mytype.getmethod("
method1
").invoke(baseobj, null); //
derived_method1
mytype.getmethod("
method2
").invoke(baseobj, null); //
derived_method2,通過反射獲取方法資訊陣列時會發現有兩個method2,但這麼呼叫只會呼叫派生類中的method2
//通過baseobj直接訪問
console.writeline(baseobj is derivedclass); //
true
baseobj.method1(); //
derived_method1
baseobj.method2(); //
base_method2
//將上面轉換後的基類變數引用的物件再次轉換為派生類物件,其原始資料不變
derivedclass derivedobj2 = baseobj as
derivedclass;
derivedobj2.method1();
//derived_method1
derivedobj2.method2(); //
derived_method2
console.writeline(derivedobj2.mynum); //
1
出處:
C 物件導向之多型
物件的型別 多型 在c 語言中,基類將型別相關的函式與派生類不做改變直接繼承的函式區分對待,對於某些函式,基類希望它的派生類各自定義適合自身的版本,此時基類就將這些函式宣告成虛函式。c 的多型性 物件導向 oop 的核心思想是多型性 polymorphism 多型這個詞源於希臘語,含義為 多種形式 ...
c 物件導向程式設計 多型
多型 即指多個不同的類對同乙個方法的不同實現。多型允許子類對從父類繼承的方法進行重新實現 多型的使用在c 中,子類使用new關鍵字來隱藏父類成員,通過方法的隱藏和方法的重寫實現多型。第一種方法的隱藏 實際呼叫父類方法 定義人類,包含工作方法 class person 定義醫生類和程式設計師類 cla...
物件導向 多型
繼承是多型的基礎,是指物件的多種形態 1.引用的多型 1 父類的引用可以指向本類的物件 2 父類的引用可以指向子類的物件 注意 子類的引用不能指向父類的物件 2.方法的多型 1 建立本類物件時,呼叫的方法是本類的方法 2 建立子類物件時,呼叫的方法是子類重寫的方法或是繼承的方法 注意 如果是子類獨有...