詳解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並不叫重寫,而是子類新創建一個方法,只是新創建的這個方法剛好跟基類中的方法同名
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。