詳解C#用new和override來實(shí)現(xiàn)抽象類的重寫區(qū)別
一,抽象的實(shí)現(xiàn)
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(); 抽象類無法被實(shí)例
Class1 c = new Class1();
BClass c2 = c;
c2.MethodA();
c.MethodA();
c2.MethodB();
c.MethodB();
c2.MethodC();
c.MethodC();
Console.ReadKey();
}
}
abstract class BClass //抽象類無法被實(shí)例
{
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"); }//如果一個(gè)虛函數(shù) 在子類中沒有通過override關(guān)鍵字,那么這個(gè)方法就沒有被重寫,而是被隱藏了
public override void MethodB() { Console.WriteLine("MethodB"); }
public override void MethodC() { base.MethodC(); }
}
}
從上圖得出的結(jié)果是:

綜上:抽象類的虛方法需要被重寫,那問題來了重寫有兩種方式,new和override又有什么區(qū)別
二,new和override重寫的區(qū)別:
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("學(xué)生都要考試");
}
public void Say()
{
Console.WriteLine("我是學(xué)生");
}
}
public class Teacher : Student
{
public override void Exam()
{
Console.WriteLine("老師不用考試");
}
//public override void Say() //報(bào)錯(cuò),提示沒有virtual,無法被重寫
//{
// Console.WriteLine("我是老師");
//}
public new void Say()
{
Console.WriteLine("我是老師");
}
}
}
結(jié)果顯示為:

綜上總結(jié):
1、如果基類沒有定義虛方法,那子類只能使用new,而不能使用override
2、基類有沒有定義虛方法,子類都可以使用new
3、子類使用new并不叫重寫,而是子類新創(chuàng)建一個(gè)方法,只是新創(chuàng)建的這個(gè)方法剛好跟基類中的方法同名
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C# 重寫ComboBox實(shí)現(xiàn)下拉任意組件的方法
- C#重寫DataGridView
- 在C#的類或結(jié)構(gòu)中重寫ToString方法的用法簡(jiǎn)介
- C#通過重寫Panel改變邊框顏色與寬度的方法
- c#方法重寫和隱藏的學(xué)習(xí)示例
- c#重寫TabControl控件實(shí)現(xiàn)關(guān)閉按鈕的方法
- C#中重載與重寫區(qū)別分析
- C#運(yùn)算符重載用法實(shí)例分析
- C#中重載相等(==)運(yùn)算符示例
- C#中多態(tài)、重載、重寫區(qū)別分析
- C#重載運(yùn)算符詳解
- 基于C#方法重載的總結(jié)詳解
- c# 重載WndProc,實(shí)現(xiàn)重寫“最小化”的實(shí)現(xiàn)方法
- C#中重載重寫和覆蓋的定義與區(qū)別
相關(guān)文章
通過容器擴(kuò)展屬性IExtenderProvider實(shí)現(xiàn)WinForm通用數(shù)據(jù)驗(yàn)證組件
這篇文章介紹了通過容器擴(kuò)展屬性IExtenderProvider實(shí)現(xiàn)WinForm通用數(shù)據(jù)驗(yàn)證組件的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
C# 延遲Task.Delay()和Thread.Sleep()的具體使用
Thread.Sleep()是同步延遲,Task.Delay()是異步延遲,本文主要介紹了C# 延遲Task.Delay()和Thread.Sleep()的具體使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
DevExpress之ChartControl用法實(shí)例總結(jié)
這篇文章主要介紹了DevExpress之ChartControl用法實(shí)例總結(jié),需要的朋友可以參考下2014-08-08
C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì)(1)
這篇文章主要介紹了C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì),獻(xiàn)上了9個(gè)類的設(shè)計(jì),需要的朋友可以參考下2015-11-11
WPF自定義MenuItem樣式的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于WPF自定義MenuItem樣式的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用WPF具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
C#實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到word或者Excel中的方法
這篇文章主要介紹了C#實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到word或者Excel中的方法,涉及C#操作word及Excel格式文件的方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08

