網站首頁 編程語言 正文
簡介:
c#中Abstract和Virtual比較容易混淆,都與繼承有關,并且涉及override的使用。virtual可以被子類重寫,而abstract必須被子類重寫。virtual修飾的方法必須有實現(哪怕是僅僅添加一對大括號),而abstract修飾的方法一定不能實現。它們有一個共同點:如果用來修飾方法,前面必須添加public,要不然就會出現編譯錯誤:虛擬方法或抽象方法是不能私有的。畢竟加上virtual或abstract就是讓子類重新定義的,而private成員是不能被子類訪問的。下面討論一下二者的區別:
一、Virtual方法(虛方法)
virtual 關鍵字用于在基類中修飾方法。virtual的使用會有兩種情況:
情況1:在基類中定義了virtual方法,但在派生類中沒有重寫該虛方法。那么在對派生類實例的調用中,該虛方法使用的是基類定義的方法。
情況2:在基類中定義了virtual方法,然后在派生類中使用override重寫該方法。那么在對派生類實例的調用中,該虛方法使用的是派生重寫的方法。
virtual可以被子類重寫:
class BaseTest1
{
public virtual void fun() { }//必須有實現
}
class DeriveTest1:BaseTest1
{
//public override void fun() { }
}
virtual修飾的方法必須有實現(哪怕是僅僅添加一對大括號):
public class Test1
{
public virtual void fun1(){}
}
二、Abstract方法(抽象方法)
abstract關鍵字只能用在抽象類中修飾方法,并且沒有具體的實現。抽象方法的實現必須在派生類中使用override關鍵字來實現。
接口和抽象類最本質的區別:抽象類是一個不完全的類,是對對象的抽象,而接口是一種行為規范。
abstract必須被子類重寫:
abstract class BaseTest2
{
public abstract void fun();
}
class DeriveTest2 : BaseTest2
{
//public override void fun();錯誤1:沒有實現
//public void fun() { } 錯誤2:重寫時沒有添加override
//override void fun() { }錯誤3:虛擬成員或者抽象成員不能是私有的(只要在父類中聲明了虛擬成員或抽象成員,即便是繼承的也要加上這個限制)
public override void fun() { }//如果重寫方法; 錯誤:“A.DeriveTest2”不實現繼承的抽象成員“A.BaseTest2.fun()”
}
abstract修飾的方法一定不能實現:
public abstract class Test2
{
public abstract void fun2() ;
}
三、關鍵字
Static:當一個方法被聲明為Static時,這個方法是一個靜態方法,編譯器會在編譯時保留這個方法的實現。也就是說,這個方法屬于類,但是不屬于任何成員,不管這個類的實例是否存在,它們都會存在。就像入口函數Static void Main,因為它是靜態函數,所以可以直接被調用。
Virtua:當一個方法被聲明為Virtual時,它是一個虛擬方法,直到你使用ClassName variable = new ClassName();聲明一個類的實例之前,它都不存在于真實的內存空間中。這個關鍵字在類的繼承中非常常用,用來提供類方法的多態性支持。
overrride:表示重寫 這個類是繼承于Shape類
virtual,abstract是告訴其它想繼承于他的類 你可以重寫我的這個方法或屬性,否則不允許。
abstract:抽象方法聲明使用,是必須被派生類覆寫的方法,抽象類就是用來被繼承的;可以看成是沒有實現體的虛方法;如果類中包含抽象方法,那么類就必須定義為抽象類,不論是否還包含其他一般方法;抽象類不能有實體的。
原文鏈接:https://www.cnblogs.com/wml-it/p/14775776.html
相關推薦
- 2022-08-06 winform把Office轉成PDF文件_C#教程
- 2022-12-15 C#利用KPM算法解決字符串匹配問題詳解_C#教程
- 2023-02-07 Hive數據去重的兩種方式?(distinct和group?by)_數據庫其它
- 2022-08-19 Python數據處理pandas讀寫操作IO工具CSV解析_python
- 2022-08-15 springboot的熱部署配置
- 2023-05-07 numpy中數組的堆疊方法_python
- 2022-03-14 Macos怎么快速打開終端
- 2022-05-11 JPA報錯IllegalArgumentException
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支