国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#中區別多態、重載、重寫

2019-11-17 03:09:58
字體:
來源:轉載
供稿:網友

C#中區別多態、重載、重寫

重寫是指重寫基類的方法,在基類中的方法必須有修飾符virtual,而在子類的方法中必須指明override。 格式: 基類中: public virtual void myMethod() { } 子類中: public override void myMethod() { } 重寫以后,用基類對象和子類對象訪問myMethod()方法,結果都是訪問在子類中重新定義的方法,基類的方法相當于被覆蓋掉了。 重載 用于在給定了參數列表和一組候選函數成員的情況下,選擇一個最佳函數成員來實施調用。 public void test(int x,int y){} public void test(int x,ref int y){} public void test(int x,int y,string a){} 重載特征: I.方法名必須相同 II.參數列表必須不相同,與參數列表的順序無關 III.返回值類型可以不相同 ========================= 但如果有泛型,就要注意了! 多態 c#的多態性主要體現在類的繼承上: 子類繼承父類的時候,可能出現同名但方法定義不同的情況, 所以在子類中會將原方法覆蓋,實現自身的要求

 1 /* 2     Function: override 3 */ 4 using System; 5 namespace TestOverride 6 { 7     class Employee 8     { 9         //父類虛方法10         public virtual void CalculatePay()11         {12             Console.WriteLine("Employee");13         }        14     }15     16        //子類繼承重寫CalculatePay()方法17     class SalariedEmploy : Employee18     {19         public override void CalculatePay()20         {21             Console.WriteLine("Salary");22         }23     }24     25     class AppPay26     {27         public static void Main(String[] args)28         {29             //父類創建實例30             Employee employee1 = new Employee();31             employee1.CalculatePay();                                     //Employee32                 33             //子類賦值給父類34             Employee employee2 = new SalariedEmploy();35             employee2.CalculatePay();                                     // Salary36             37             //子類創建實例38             SalariedEmploy employee3 = new SalariedEmploy();39             employee3.CalculatePay();                                    //Salary40             41         }        42     }43 }44 /*45 Out:46 Employe47 Salary48 Salary49 */
View Code

*****************************************************************************************************************

C#之重載與覆蓋

overload:重載指的是同一個類中有兩個或多個名字相同但是參數不同的方法,(注:返回值不能區別函數是否重載),重載沒有關鍵字override:過載也稱重寫是指子類對父類中虛函數或抽象函數的“覆蓋”(這也就是有些書將過載翻譯為覆蓋的原因),但是這種“覆蓋”和用new關鍵字來覆蓋是有區別的。new:覆蓋指的是不同類中(基類或派生類)有兩個或多個返回類型、方法名、參數都相同,但是方法體不同的方法。但是這種覆蓋是一種表面上的覆蓋,所以也叫隱藏,被覆蓋的父類方法是可以調用得到的。重載覆蓋的發生條件:重載,必然發生在一個類中,函數名相同,參數類型或者順序不同構成重載,與返回類型無關重寫,必然發生在基類和派生類中,其類函數用virtual修飾,派生類用override修飾覆蓋,在子類中寫一個和基類一樣名字(參數不同也算)的非虛函數,會讓基類中的函數被隱藏,編譯后會提示要求使用New關鍵字重載示例:

復制代碼
        public void Fun()        {            Console.WriteLine("I am F");        }        public  void Fun(int i)        {            Console.WriteLine("I am F,i={0}",i);        }
復制代碼

override重寫特性: 由 override 聲明重寫的方法稱為重寫基方法,重寫的基方法必須與 override 方法具有相同的簽名。重寫的基方法必須是 virtual、abstract 或 override 的,不能重寫非虛方法或靜態方法。override的方法和virtual的方法必須具有相同的訪問級別修飾符,不能更改 virtual 方法的可訪問性。不能使用new、static 或 virtual 修飾符來修改 override 方法。重寫屬性聲明必須指定與繼承屬性完全相同的訪問修飾符、類型和名稱,并且被重寫的屬性必須是virtual、abstract 或 override 的。覆蓋示例:當我們沒有使用覆蓋時,派生類繼承基類,結果如下:

復制代碼
    class A    {        public void Fun()        {            Console.WriteLine("I am F");        }    }    class PRogram:A    {        static void Main(string[] args)        {            Program p = new Program();            p.Fun();            Console.Read();        }    }//結果為:I am F
復制代碼

當我們覆蓋原來的方法呢?

復制代碼
    class A    {        public void Fun()        {            Console.WriteLine("I am F");        }    }    class Program:A    {        public new void Fun()        {            int i = 1;            Console.WriteLine("I am F,i={0}", i);        }        static void Main(string[] args)        {            Program p = new Program();            p.Fun();            Console.Read();        }    }//結果為:I am F,i=1
復制代碼

new覆蓋與重寫、重載的區別:當子類與父類的參數不同時當基類函數不是虛函數時,基類函數將被隱藏。(因為子類和基類不在同一范圍內,所以不是重載)當基類函數是虛函數時,基類函數將被隱藏。(因為子類和基類不在同一范圍內,所以不是重載;因為參數不同,所以不是重寫) 當子類與父類的參數相同時當基類函數不是虛函數時,基類函數將被隱藏。(因為子類和基類不在同一范圍內,所以不是重載,因為基類不是虛函數,所以是隱藏不是重寫)當基類函數是虛函數時,基類函數將被覆蓋。(因為子類和基類不在同一范圍內,所以不是重載)那么為什么不是重寫呢?我們可以做一個例子還測試一下,這個例子在虛函數時已經舉過,在這里為了說明此問題在重復一下:

復制代碼
    class A    {        public virtual void Fun()        {            Console.WriteLine("I am F");        }    }    class Program:A    {        public override void Fun()        {            int i = 1;            Console.WriteLine("I am F,i={0}", i);        }        static void Main(string[] args)        {            A p = new Program();            p.Fun();            Console.Read();        }    }
復制代碼

我們知道,以上例子中,派生類存在一個對基類的重寫方法,所以結果為:I am F ,i=1若是我們把override換成new,那么如果是重寫的話,會和上面的結果相等,但實際結果是什么呢?實際的結果是:I am F由此我們知道,當基類函數是虛函數時,基類函數不是重寫,而是覆蓋了基函數的同名函數。

文章出處:http://m.survivalescaperooms.com/jiajiayuan/archive/2011/09/15/2177051.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 山阴县| 许昌县| 景泰县| 乌鲁木齐县| 太保市| 连平县| 阿鲁科尔沁旗| 乌兰县| 阳江市| 临清市| 噶尔县| 庆城县| 米脂县| 潮安县| 芜湖市| 峨边| 阿坝| 扎赉特旗| 阿荣旗| 乐业县| 瓦房店市| 恩平市| 泽普县| 西吉县| 八宿县| 勐海县| 洛隆县| 石棉县| 惠州市| 丰县| 滨海县| 北安市| 长治县| 镇康县| 蒲江县| 平山县| 三原县| 富蕴县| 佛教| 乌拉特后旗| 屯留县|