網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
簡(jiǎn)介:
c#中Abstract和Virtual比較容易混淆,都與繼承有關(guān),并且涉及override的使用。virtual可以被子類(lèi)重寫(xiě),而abstract必須被子類(lèi)重寫(xiě)。virtual修飾的方法必須有實(shí)現(xiàn)(哪怕是僅僅添加一對(duì)大括號(hào)),而abstract修飾的方法一定不能實(shí)現(xiàn)。它們有一個(gè)共同點(diǎn):如果用來(lái)修飾方法,前面必須添加public,要不然就會(huì)出現(xiàn)編譯錯(cuò)誤:虛擬方法或抽象方法是不能私有的。畢竟加上virtual或abstract就是讓子類(lèi)重新定義的,而private成員是不能被子類(lèi)訪問(wèn)的。下面討論一下二者的區(qū)別:
一、Virtual方法(虛方法)
virtual 關(guān)鍵字用于在基類(lèi)中修飾方法。virtual的使用會(huì)有兩種情況:
情況1:在基類(lèi)中定義了virtual方法,但在派生類(lèi)中沒(méi)有重寫(xiě)該虛方法。那么在對(duì)派生類(lèi)實(shí)例的調(diào)用中,該虛方法使用的是基類(lèi)定義的方法。
情況2:在基類(lèi)中定義了virtual方法,然后在派生類(lèi)中使用override重寫(xiě)該方法。那么在對(duì)派生類(lèi)實(shí)例的調(diào)用中,該虛方法使用的是派生重寫(xiě)的方法。
virtual可以被子類(lèi)重寫(xiě):
class BaseTest1
{
public virtual void fun() { }//必須有實(shí)現(xiàn)
}
class DeriveTest1:BaseTest1
{
//public override void fun() { }
}
virtual修飾的方法必須有實(shí)現(xiàn)(哪怕是僅僅添加一對(duì)大括號(hào)):
public class Test1
{
public virtual void fun1(){}
}
二、Abstract方法(抽象方法)
abstract關(guān)鍵字只能用在抽象類(lèi)中修飾方法,并且沒(méi)有具體的實(shí)現(xiàn)。抽象方法的實(shí)現(xiàn)必須在派生類(lèi)中使用override關(guān)鍵字來(lái)實(shí)現(xiàn)。
接口和抽象類(lèi)最本質(zhì)的區(qū)別:抽象類(lèi)是一個(gè)不完全的類(lèi),是對(duì)對(duì)象的抽象,而接口是一種行為規(guī)范。
abstract必須被子類(lèi)重寫(xiě):
abstract class BaseTest2
{
public abstract void fun();
}
class DeriveTest2 : BaseTest2
{
//public override void fun();錯(cuò)誤1:沒(méi)有實(shí)現(xiàn)
//public void fun() { } 錯(cuò)誤2:重寫(xiě)時(shí)沒(méi)有添加override
//override void fun() { }錯(cuò)誤3:虛擬成員或者抽象成員不能是私有的(只要在父類(lèi)中聲明了虛擬成員或抽象成員,即便是繼承的也要加上這個(gè)限制)
public override void fun() { }//如果重寫(xiě)方法; 錯(cuò)誤:“A.DeriveTest2”不實(shí)現(xiàn)繼承的抽象成員“A.BaseTest2.fun()”
}
abstract修飾的方法一定不能實(shí)現(xiàn):
public abstract class Test2
{
public abstract void fun2() ;
}
三、關(guān)鍵字
Static:當(dāng)一個(gè)方法被聲明為Static時(shí),這個(gè)方法是一個(gè)靜態(tài)方法,編譯器會(huì)在編譯時(shí)保留這個(gè)方法的實(shí)現(xiàn)。也就是說(shuō),這個(gè)方法屬于類(lèi),但是不屬于任何成員,不管這個(gè)類(lèi)的實(shí)例是否存在,它們都會(huì)存在。就像入口函數(shù)Static void Main,因?yàn)樗庆o態(tài)函數(shù),所以可以直接被調(diào)用。
Virtua:當(dāng)一個(gè)方法被聲明為Virtual時(shí),它是一個(gè)虛擬方法,直到你使用ClassName variable = new ClassName();聲明一個(gè)類(lèi)的實(shí)例之前,它都不存在于真實(shí)的內(nèi)存空間中。這個(gè)關(guān)鍵字在類(lèi)的繼承中非常常用,用來(lái)提供類(lèi)方法的多態(tài)性支持。
overrride:表示重寫(xiě) 這個(gè)類(lèi)是繼承于Shape類(lèi)
virtual,abstract是告訴其它想繼承于他的類(lèi) 你可以重寫(xiě)我的這個(gè)方法或?qū)傩裕駝t不允許。
abstract:抽象方法聲明使用,是必須被派生類(lèi)覆寫(xiě)的方法,抽象類(lèi)就是用來(lái)被繼承的;可以看成是沒(méi)有實(shí)現(xiàn)體的虛方法;如果類(lèi)中包含抽象方法,那么類(lèi)就必須定義為抽象類(lèi),不論是否還包含其他一般方法;抽象類(lèi)不能有實(shí)體的。
原文鏈接:https://www.cnblogs.com/wml-it/p/14775776.html
相關(guān)推薦
- 2023-01-02 C#中static的詳細(xì)用法實(shí)例_C#教程
- 2022-10-11 Android獲取Apk使用信息
- 2022-09-24 Go?select使用與底層原理講解_Golang
- 2023-02-12 python中使用docx模塊處理word文檔_python
- 2022-04-01 SQL?Server?索引和視圖詳解_MsSql
- 2023-10-09 instanceof` 的基本工作原理
- 2022-06-21 C語(yǔ)言詳解無(wú)頭單向非循環(huán)鏈表各種操作方法_C 語(yǔ)言
- 2022-04-22 最新版npm : 無(wú)法將“npm”項(xiàng)識(shí)別為 cmdlet、函數(shù)、腳本文件或可運(yùn)行程序的名稱(chēng)。請(qǐng)檢查
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支