這篇文章主要介紹了詳解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並不叫重寫,而是子類別新創建一個方法,只是新創建的這個方法剛好跟基類中的方法同名
以上就是詳解C#用new和override來實現抽象類的重寫區別的內容,更多相關內容請關注PHP中文網(www.php.cn)!