詳解C#用new和override來實現抽象類的重寫區別。本站提示廣大學習愛好者:(詳解C#用new和override來實現抽象類的重寫區別)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C#用new和override來實現抽象類的重寫區別正文
一,抽象的實現
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Virtualdemo { class Program { static void Main(string[] args) {//BClass A = new BClass(); 抽象類無法被實例 Class1 c = new Class1(); BClass c2 = c; c2.MethodA(); c.MethodA(); c2.MethodB(); c.MethodB(); c2.MethodC(); c.MethodC(); Console.ReadKey(); } } abstract class BClass //抽象類無法被實例 { public virtual void MethodA() { Console.WriteLine("BClassA"); } public virtual void MethodB() { Console.WriteLine("BClassB"); } public virtual void MethodC() { Console.WriteLine("BClassC"); } } class Class1 : BClass { public void MethodA() { Console.WriteLine("MethodA"); }//如果一個虛函數 在子類中沒有通過override關鍵字,那麼這個方法就沒有被重寫,而是被隱藏了 public override void MethodB() { Console.WriteLine("MethodB"); } public override void MethodC() { base.MethodC(); } } }
從上圖得出的結果是:
綜上:抽象類的虛方法需要被重寫,那問題來了重寫有兩種方式,new和override又有什麼區別
二,new和override重寫的區別:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Virtualdemo { class Program { static void Main(string[] args) { Teacher t = new Teacher(); Student stu = t; stu.Exam(); stu.Say(); t.Say(); Console.ReadKey(); } } public abstract class Student { public virtual void Exam() { Console.WriteLine("學生都要考試"); } public void Say() { Console.WriteLine("我是學生"); } } public class Teacher : Student { public override void Exam() { Console.WriteLine("老師不用考試"); } //public override void Say() //報錯,提示沒有virtual,無法被重寫 //{ // Console.WriteLine("我是老師"); //} public new void Say() { Console.WriteLine("我是老師"); } } }
結果顯示為:
綜上總結:
1、如果基類沒有定義虛方法,那子類只能使用new,而不能使用override
2、基類有沒有定義虛方法,子類都可以使用new
3、子類使用new並不叫重寫,而是子類新創建一個方法,只是新創建的這個方法剛好跟基類中的方法同名
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。