c#的多台方法,大體上和c++的類似,但是有點區別的,我這裡剛剛初學,因此把重點記錄下。
多型是同乙個行為具有多個不同表現形式或形態的能力。
多型性意味著有多重形式。在物件導向程式設計正規化中,多型性往往表現為"乙個介面,多個功能"。
多型性可以是靜態的或動態的。在靜態多型性中,函式的響應是在編譯時發生的。在動態多型性中,函式的響應是在執行時發生的。
在c#中,每個型別都是多型的,因為包括使用者定義型別在內的所有型別都繼承自object。
using system;
class rectangle: shape //繼承shape抽象類
//public int area() //編譯錯誤
public override int area () //重新做派生類中實現area方法,但要是用override「重寫」,否則編譯錯誤
}class rectangletester
",a);
console.readkey();}}
}
2.2虛方法之virtual
當有乙個定義在類中的函式需要在繼承類中實現時,可以使用虛方法。虛方法是使用關鍵字 virtual宣告的。虛方法可以在不同的繼承類中有不同的實現。對虛方法的呼叫是在執行時發生的。
c#的動態多型性是通過 抽象類 和 虛方法 實現的。
以下例項建立了 shape 基類,並建立派生類 circle、 rectangle、********, shape 類提供乙個名為 draw 的虛擬方法,在每個派生類中重寫該方法以繪製該類的指定形狀。
虛方法的例項如下:
#define ov //巨集定義一定要放在using前面
/*如果注釋掉上面的巨集定義,那麼程式輸出的結果是:
執行基類的畫圖任務
執行基類的畫圖任務
執行基類的畫圖任務
說明,使用new的方法是錯誤的,與設想的功能偏離了。
* 說白了,子類呼叫draw()的使用是呼叫了基類的draw().並沒有實現多型的功能
如果使用上面的巨集定義
輸出是畫乙個長方形
執行基類的畫圖任務
畫乙個三角形
執行基類的畫圖任務
畫乙個圓形
執行基類的畫圖任務
請按任意鍵繼續. . .
這樣就實現了多型。
* * 這裡強調一次:
* 在子類中用 override 重寫父類中用 virtual 申明的虛方法時,
* 例項化父類呼叫該方法,執行時呼叫的是子類中重寫的方法;
如果在子類中用 new 覆蓋父類中用 virtual 申明的虛方法時,
* 例項化父類呼叫該方法,執行時呼叫的是父類中的虛方法
* * override是重寫,即將基類的方法在派生類裡直接抹去重新寫,故而呼叫的方法就是子類方法;
* 而new只是將基類的方法在派生類裡隱藏起來,故而呼叫的仍舊是基類方法。
*/using system;
using system.collections.generic;
public class shape
//public int y
//public int height
//public int width
// 虛方法
public virtual void draw()
}class circle : shape
}class rectangle : shape
}class ******** : shape
}class program
; // 使用 foreach 迴圈對該列表的派生類進行迴圈訪問,並對其中的每個 shape 物件呼叫 draw 方法
foreach (var shape in shapes)
"按下任意鍵退出。");
}}
在來乙個例項:
using system;
using system.collections.generic;
using system.linq;
using system.text;
class rectangle : shape //繼承抽象類
public override int area() //重寫抽象類的方法
}class ******** : shape //繼承抽象類
public override int area() //重寫抽象類的方法
}class rectangletester
, 三角形面積:", a, b);}}
}
/*執行結果:
計算長方形類的面積:
計算三角形類的面積:
長方形面積: 70, 三角形面積:35
請按任意鍵繼續. . .
*/3、總結:
c# 多型性
3.1、多型:乙個介面多個功能。
靜態多型性:編譯時發生函式響應(呼叫);
動態多型性:執行時發生函式響應。
靜態繫結(早期繫結):編譯時函式和物件的連線機制。兩種技術實現靜態多型性:函式過載/運算子過載。
3.2、函式過載:在同一範圍內對相同函式名有多個定義,可以是引數型別或引數個數的不同,但不許只有返回值型別不同。
運算子過載,這個後續在討論。
3.3、關鍵字 abstract 宣告抽象類:用於介面部分類的實現(派生類繼承抽象類時,實現完成)。抽象類包含抽象方法,抽象方法可被派生類實現。
抽象類規則:
1.不能建立抽象類的例項
2.不能在抽象類外定義抽象方法
3.不能把抽象類宣告為sealed(類前帶關鍵字sealed代表該類是密封類,不能被繼承)
4.關鍵字virtual宣告虛方法:用於方法在繼承類中的實現(在不同的繼承類中有不同的實現)。虛方法也可以被直接呼叫。
抽象類和虛方法共同實現動態多型性。
注:繼承類中的重寫虛函式需要宣告關鍵字 override,在方法引數傳入中寫(類名 形參名)例如 public void callarea(shape sh),意思是傳入乙個 shape 型別的類。
3.4、virtual 和 abstract區別
virtual和abstract都是用來修飾父類的,通過覆蓋父類的定義,讓子類重新定義。
1.virtual修飾的方法必須有實現(哪怕是僅僅新增一對大括號),而abstract修飾的方法一定不能實現。
2.virtual可以被子類重寫,而abstract必須被子類重寫。
3.如果類成員被abstract修飾,則該類前必須新增abstract,因為只有抽象類才可以有抽象方法。
4.無法建立abstract類的例項,只能被繼承無法例項化。
5.虛方法也可以被直接呼叫
3.5、過載和重寫區別
過載(overload)是提供了一種機制,相同函式名通過不同的返回值型別以及引數來表來區分的機制。過載在同乙個作用域(一般指乙個類)的兩個或多個方法函式名相同,引數列表不同的方法叫做過載,它們有三個特點(俗稱兩必須一可以):
a.方法名必須相同
b.引數列表必須不相同
c.返回值型別可以不相同
重寫(override)是用於重寫基類的虛方法,這樣在派生類中提供乙個新的方法。
子類中為滿足自己的需要來重複定義某個方法的不同實現,需要用 override 關鍵字,被重寫的方法必須是虛方法,用的是 virtual 關鍵字。它的特點是(三個相同):
相同的方法名
相同的引數列表
相同的返回值
3.6、抽象方法和虛方法的區別
1.虛方法必須有實現部分,抽象方法沒有提供實現部分,抽象方法是一種強制派生類覆蓋的方法,否則派生類將不能被例項化。這個是特別需要注意的!
2.抽象方法只能在抽象類中宣告,虛方法不是。如果類包含抽象方法,那麼該類也是抽象的,也必須宣告類是抽象的。這一點好c++是一樣的。
3.抽象方法必須在派生類中重寫,這一點和介面類似,虛方法不需要再派生類中重寫。簡單說,抽象方法是需要子類去實現的。虛方法是已經實現了的,可以被子類覆蓋,也可以不覆蓋,取決於需求。
抽象方法和虛方法都可以供派生類重寫。
多型學習總結
一.多型性的概念 二.虛函式 class 類名 virtual 返回型別 函式名 形式引數列表 虛函式 includeusing namespace std class point 表示平面上的點 virtual double area 虛函式 class circle public point 圓...
C 學習筆記之多型 多型的學習 多型學習
c 學習筆記之多型 多型的學習 多型學習 多型分為兩類 靜態多型 函式過載和運算子過載屬於靜態多型,復用函式名 動態多型 派生類和虛函式實現執行時多型 靜態多型和動態多型的區別 靜態多型的函式位址早繫結 編譯階段確定函式位址 動態多型的函式位址晚繫結 執行階段確定函式位址 動態多型滿足條件 動態多型...
c 多型總結
多型 多型可以簡單地概括為 乙個介面,多種方法 程式在執行時才決定呼叫的函式,它是物件導向程式設計領域的核心概念。接下來,我寫乙個簡單地函式來說明多型 includeusing namespace std int add int left,int right float add float left...