深入理解c#多態(tài)
繼承概念
多態(tài):即一個(gè)接口,多個(gè)功能
同一種操作作用于不同的對(duì)象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果
多態(tài)性可以是靜態(tài)的或動(dòng)態(tài)的。在靜態(tài)多態(tài)性中,函數(shù)的響應(yīng)是在編譯時(shí)發(fā)生的。在動(dòng)態(tài)多態(tài)性中,函數(shù)的響應(yīng)是在運(yùn)行時(shí)發(fā)生的
靜態(tài)多態(tài)性
在靜態(tài)多態(tài)性中,函數(shù)的響應(yīng)是在編譯時(shí)發(fā)生的
父類中如果有方法需要子類重寫(xiě),可以將該方法標(biāo)記為虛方法
虛方法必須在父類中有實(shí)現(xiàn),空實(shí)現(xiàn)也可以
虛方法子類可以重寫(xiě),也可以不重寫(xiě)
實(shí)現(xiàn)靜態(tài)多態(tài)性有兩種方法;
函數(shù)重載
運(yùn)算符重載
函數(shù)重載
即在同一范圍中對(duì)同一函數(shù)名的多重定義
通過(guò)定義函數(shù)的傳參的不同類型或數(shù)量進(jìn)行區(qū)分
在調(diào)用函數(shù)時(shí),根據(jù)傳的參數(shù)類型和數(shù)量判斷調(diào)用名字相同的那個(gè)方法
using System; namespace 函數(shù)重載 { class printdata { void print(int i) { Console.WriteLine("printing int: {0}", i); } void print(double f) { Console.WriteLine("printing folat: {0}", f); } void print(string s) { Console.WriteLine("printing string: {0}", s); } static void Main(string[] args) { printdata p = new printdata(); // 調(diào)用 print 來(lái)打印整數(shù) p.print(34); // 調(diào)用 print 來(lái)打印浮點(diǎn)數(shù) p.print(234.643); // 調(diào)用 print 來(lái)打印字符串 p.print("Hello Tynam"); Console.ReadKey(); } } }
運(yùn)行結(jié)果
運(yùn)算符重載
重定義或重載C#中內(nèi)置的運(yùn)算符
通過(guò)關(guān)鍵字operator加運(yùn)算符的符號(hào)來(lái)定義
與其他函數(shù)一樣,重載運(yùn)算符有返回類型和參數(shù)列表
using System; namespace 運(yùn)算符重載 { class Complex { public int x; public int y; public int z; public Complex(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } public static Complex operator+(Complex v1,Complex v2) { return new Complex(v1.x + v2.x,v1.y + v2.y,v1.z + v2.z); } public static Complex operator /(Complex v1, Complex v2) { return new Complex(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z); } } class Program { static void Main(string[] args) { Complex v1 = new Complex(1,20,31); Complex v2 = new Complex(5,6,7); Complex v3 = v1 + v2; Complex v4 = v1 / v2; Console.WriteLine("x is {0} ; y is {1} ; z is {2}", v3.x, v3.y, v3.z); Console.WriteLine("x is {0} ; y is {1} ; z is {2}", v4.x, v4.y, v4.z); Console.ReadKey(); } } }
運(yùn)行結(jié)果
可重載和不可重載運(yùn)算符
可以被重載的一元運(yùn)算符:+、 -、 !、~、++、--
可以被重載的二元運(yùn)算符:+、 -、 *、 /、 %
可以被重載的比較運(yùn)算符:==、!=、<、>、<=、>=
不能被直接重載的條件邏輯運(yùn)算符:&&、||
不能被重載的賦值運(yùn)算符:+=、-=、*=、/=、 %=
不能被重載的其他運(yùn)算符:=、 .、 ?:, ->、 new、 is、sizeof、typeof
動(dòng)態(tài)多態(tài)性
在動(dòng)態(tài)多態(tài)性中,函數(shù)的響應(yīng)是在運(yùn)行時(shí)發(fā)生的
使用關(guān)鍵字abstract創(chuàng)建抽象類,用于提供接口的部分類的實(shí)現(xiàn)
當(dāng)一個(gè)派生類繼承自該抽象類時(shí),實(shí)現(xiàn)即完成
抽象類包含抽象方法,抽象方法可被派生類實(shí)現(xiàn)
抽象方法不允許有方法體的
當(dāng)一個(gè)子類繼承抽象類時(shí),必須把父類的所有抽象成員都重寫(xiě);若子類也是一個(gè)抽象類,可以不寫(xiě)
子類重寫(xiě)父類的方法,參數(shù)和返回值必須跟父類一樣
抽象方法不能用static修飾
抽象類是有構(gòu)造函數(shù)的,雖然不能被實(shí)例化
抽象類標(biāo)記abstract,不能有任何實(shí)現(xiàn),不能有方法體
using System; namespace 動(dòng)態(tài)多態(tài)性 { abstract class Shape { public abstract int area(); } class Rectangle : Shape { private int length; private int width; public Rectangle(int a = 0, int b = 0) { length = a; width = b; } public override int area() { return (width * length); } } class RectangleTester { static void Main(string[] args) { Rectangle r = new Rectangle(2, 4); double a = r.area(); Console.WriteLine("RectangleArea is: {0}",a); Console.ReadKey(); } } }
運(yùn)行結(jié)果
以上就是深入理解c#多態(tài)的詳細(xì)內(nèi)容,更多關(guān)于C#多態(tài)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
c#之圓形無(wú)標(biāo)題欄橢圓窗體的實(shí)現(xiàn)詳解
本篇文章是對(duì)c#中圓形無(wú)標(biāo)題欄橢圓窗體的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06C# RGB圖像和灰度圖像互轉(zhuǎn)的實(shí)現(xiàn)
在我們的圖像類型教程中定義了RGB顏色模型和灰度格式,本文主要介紹了C# RGB圖像和灰度圖像互轉(zhuǎn)的實(shí)現(xiàn),文中通過(guò)代碼介紹的非常清楚,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08C#實(shí)現(xiàn)xml文件的讀取與寫(xiě)入簡(jiǎn)單實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)xml文件的讀取與寫(xiě)入方法,涉及C#操作XML文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08C# 復(fù)制指定節(jié)點(diǎn)的所有子孫節(jié)點(diǎn)到新建的節(jié)點(diǎn)下
這篇文章主要介紹了C# 復(fù)制指定節(jié)點(diǎn)的所有子孫節(jié)點(diǎn)到新建的節(jié)點(diǎn)下的相關(guān)資料,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10使用C# Winform應(yīng)用程序獲取網(wǎng)頁(yè)源文件的解決方法
本篇文章是對(duì)使用C# Winform應(yīng)用程序獲取網(wǎng)頁(yè)源文件的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Unity接入百度AI實(shí)現(xiàn)果蔬識(shí)別
本文將介紹如何利用Unity接入百度AI從而實(shí)現(xiàn)果蔬識(shí)別,可以做到識(shí)別近千種水果和蔬菜的名稱,可自定義返回識(shí)別結(jié)果數(shù)。感興趣的小伙伴可以了解一下2022-02-02C#實(shí)現(xiàn)順序表(線性表)完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)順序表(線性表)的方法,結(jié)合完整實(shí)例形式分析了順序表的原理及C#相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-06-06Winform中Treeview實(shí)現(xiàn)按需加載的方法
這篇文章主要介紹了Winform中Treeview實(shí)現(xiàn)按需加載的方法,針對(duì)大數(shù)據(jù)量的情況下非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10