C#中修飾符——abstract、virtual

一、多態簡介

????????在面向對象編程的過程中,多態體現出來的是【一個接口,多個功能】;多態性體現在2個方面:

????????1、程序運行時,在方法參數、集合或數組等位置,派生類對象可以作為基類的對象處理;這樣該對象聲明的類型就與運行時的類型不同了;

????????2、基類可以定義并實現虛方法,派生類可以重寫這些虛方法;在程序運行時,可以調用基類方法執行派生類的重寫方法。

????????在C#中要實現多態,必須使用abstract、virtual這個兩個修飾符來定義,使用override來重寫方法。 多態又可以分為:【靜態多態性】、【動態多態性】;

二、靜態多態性

?????????靜態多態性(即:使用static修飾;變量、函數的響應是在程序編譯時就發生了)若一個方法被static聲明,則該方法就是靜態方法,那么編譯器就會在編譯時保留這個靜態方法的實現;也就是說這個靜態方法只屬于類,而不屬于任何實例,無論實例是否存在,都可以可直接調用這個靜態方法。

? ? ? ? C#中的靜態多態性分為兩種:【函數重載】、【運算符重載】

    //靜態函數重載示例public class StaticReload{public static void Greet(){Console.WriteLine($"你好,歡迎訪問");}public static void Greet(string greetMsg){Console.WriteLine(greetMsg);}}//Class_endclass Program{static async Task Main(string[] args){StaticReload.Greet();StaticReload.Greet("Quartz定時任務測試");}}

?

運算符重載 - 定義一元運算符、算術運算符、相等運算符和比較運算符。 - C# reference | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/operator-overloading

三、動態多態性

????????動態多態性(無static修飾;變量、函數的響應是在程序運行起來后發生的)。

?3.1、abstract(抽象)

abstract 關鍵字 - C# reference | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/abstract????????【abstract】關鍵字可用于修飾類(Class)、方法(Method)、屬性(attribute)、索引(index)和事件(Event);

? 3.1.1、抽象類

?????????在類(class)前面放置修飾符【abstract】,則可以將類聲明為抽象類;

抽象類的特點
序號抽象類特點
1抽象類不能實例化
2抽象類可能包含抽象方法和訪問器
3

無法使用?sealed?修飾符來修改抽象類

因為兩個修飾符的含義相反【?sealed?修飾符阻止類被繼承;而?abstract?修飾符要求類被繼承】

4派生自抽象類的非抽象類,必須實際實現所繼承抽象類的全部抽象內容(抽象方法、屬性、索引、事件)
    public abstract class MyShape{public abstract float GetArea();public abstract string Name { get;}public abstract Action<float> GetAction();}//Class_endpublic class Circle : MyShape{private int _radius;public Circle(int r){_radius = r;}public override string Name {get => "我是圓";}public override Action<float> GetAction(){throw new NotImplementedException();}public override float GetArea(){var tmp =Math.PI * (_radius * _radius);float result =(float)tmp;return result;}}//Class_endclass Program{static async Task Main(string[] args){MyShape myShape = new Circle(3);float shapeArea = myShape.GetArea();Console.WriteLine($"Name:{myShape.Name}  ShapeArea: {shapeArea}");}}

?

抽象類、密封類及類成員 - C# | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/abstract-and-sealed-classes-and-class-members?

? 3.1.2、抽象方法

???在方法、屬性、索引、事件前面放置修飾符【abstract,則可以聲明為抽象方法、屬性、索引、事件;且表明方法、屬性、索引、事件不包含實現。

抽象方的法特點
序號抽象方法特點
1只有抽象類中才允許聲明抽象方法
2

抽象方法不提供實際實現,所以聲明僅以分號結尾,沒有大括號{};具體實現由一般類繼承抽象類使用?override重寫

public abstract float GetArea();
3抽象方法聲明中使用?static?或?virtual?修飾符是錯誤的

? 3.1.3、abstract的使用場景

? ? ? ? 內容有通用的共性特征和行為,且必須要在不同的派生類實現(即:內容必須存在的時候用abstract)。

?3.2、virtual(虛擬)

virtual 關鍵字 - C# reference | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/virtual? 【virtual?】關鍵字用于修改方法、屬性、索引器或事件聲明,并使它們可以在派生類中被重寫。

? 3.2.1、虛方法

    public class MyCar{public virtual string Name { get; set; }public virtual string Manufacturer { get; }public MyCar(string manufacturer){this.Manufacturer = manufacturer;}public virtual void Function(){Console.WriteLine($"【{Manufacturer}】品牌車況運行狀態良好");}public virtual Action<bool> Custom(bool start){if (start){Console.WriteLine($"【{Name}】儀表盤顯示發動機轉速");}return null;}}//Classpublic class SUVCar : MyCar{public SUVCar(string manufacturer) : base(manufacturer){}public override void Function(){base.Function();Console.WriteLine($"【{Manufacturer}】品牌開始校驗SUV的各個功能是否正常");}public override Action<bool> Custom(bool start){Action<bool> action=new Action<bool>(Test);Console.WriteLine($"【{Name}】所有功能準備完畢,開始出發");return action;}private void Test(bool start){if (start){Console.WriteLine("啟動智能駕駛功能");}}}//Class_endclass Program{static async Task Main(string[] args){MyCar car = new MyCar("自產");car.Name = "基礎車";car.Function();car.Custom(true);Console.WriteLine("---------------------------\r\n");car = new SUVCar("問界");car.Name = "SUV越野";car.Function();car.Custom(true);}}

虛方法的特點
序號虛方法特點
1虛方法必須有實現
2虛方法可以不在派生類中重寫
虛方法的2中使用情況
1基類定義了virtual方法,但是派生類沒有重寫基類virtual方法,則對派生類的實例調用中,使用的是基類定義的virtual方法內容
2基類定義了virtual方法,且派生類重寫了基類的virtual方法,則對派生類的實例調用中,使用的是派生類重寫的virtual方法內容

? 3.2.2、virual的使用場景

????????virtual的核心是多態【即:同一個方法能用不同的方式來做】;如:

1、支付方法Pay(),既可使用微信支付、也可使用支付寶支付或者其他方法支付;

2、消息發送方法MSGSend(),既可使用郵件發送、也可使用企業微信發送、或釘釘發送;

3.3、抽象方法與虛方法的區別與聯系

抽象方法與虛方法的相同點是:都使用override重寫。

抽象方法與虛方法的區別
序號抽象方法(abstract)虛方法(virtual)
1抽象方法必須在抽象類中沒有要求
2抽象方法只是聲明沒有實際實現,必須在派生類中重寫實現虛方法有聲明與實際實現,派生類可完全重寫、部分重寫或不重寫直接使用基類實現
3抽象類不能被實例化(new),只能用實現了全部抽象方法的派生類來實例化包含虛方法的類可以被實例化(new)

?3.4、普通類、接口與抽象類

抽象類主要用于關系密切的對象接口適合為不相關的類提供通用功能

普通類、接口、抽象類區別與聯系
序號普通類接口抽象類
1普通類可有成員變量、常量、構造函數,沒有抽象方法接口不能有常量、域、操作符、構造函數、析構函數及其任何靜態成員【可包含屬性、方法、索引和事件】抽象類有抽象方法
2普通類可繼承一個基類,多個接口接口可繼承多個接口抽象類也可繼承一個基類和多個接口
3普通類可以定義具體的方法和實際實現接口只能定義方法,而沒有具體實現抽象類的抽象方法不能有具體實現
4普通類成員沒有限制接口成員必須是公共的抽象類不能對private抽象
5普通類可以實例化接口不能實例化抽象類不能實例化,只能使用實現了全部抽象方法的派生類來實例化

四、其他資料

訪問修飾符 - C# reference | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/access-modifiers

面向對象編程 - 封裝 - C# | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/fundamentals/object-oriented/#encapsulation面向對象編程 - 繼承 - C# | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/fundamentals/object-oriented/inheritance面向對象編程 - 多態性 - C# | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/fundamentals/object-oriented/polymorphismC#面向對象的三大特性(封裝、繼承、多態)_c# 三大特性-CSDN博客文章瀏覽閱讀3.2k次,點贊3次,收藏43次。一、封裝 把客觀的事物封裝成類,并將類的內部實現隱藏,以保證數據的完整性;每個對象都包含了他能進行操作所需要的所有信息,因此對象不必依靠其他的對象來完成自己的操作。【優點】 1. 將變化隔離; 2. 便于使用; 3. 提高復用性; 4. 提高安全性;【封裝原則】 1. 將不需要對外提供的內容都隱藏起來; 2...._c# 三大特性 https://blog.csdn.net/xiaochenXIHUA/article/details/95037977

C#中抽象類和接口的區別與應用場景 https://www.cnblogs.com/yangzhou/p/3283994.html?搞了這么多年終于知道接口和抽象類的應用場景了https://cloud.tencent.com/developer/article/1677833

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74321.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74321.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74321.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot + Spring Integration整合MQTT打造雙向通信客戶端

1. 概述 本文分兩個章節講解MQTT相關的知識&#xff0c;第一部份主要講解MQTT的原理和相關配置&#xff0c;第二個章節主要講和Spring boot的integration相結合代碼的具體實現&#xff0c;如果想快速實現功能&#xff0c;可直接跳過第一章節查看第二章講。 1.1 MQTT搭建 為了…

2025前端面試題記錄

vue項目目錄的執行順序是怎么樣的&#xff1f; 1、package.json   在執行npm run dev時&#xff0c;會在當前目錄尋找package.json文件&#xff0c;此文件包含了項目的名稱版本、項目依賴等相關信息。 2、webpack.config.js(會被vue-cli腳手架隱藏) 3、vue.config.js   對…

專題|Python貝葉斯網絡BN動態推理因果建模:MLE/Bayes、有向無環圖DAG可視化分析呼吸疾病、汽車效能數據2實例合集

原文鏈接&#xff1a;https://tecdat.cn/?p41199 作為數據科學家&#xff0c;我們始終在探索能夠有效處理復雜系統不確定性的建模工具。本專題合集系統性地解構了貝葉斯網絡&#xff08;BN&#xff09;這一概率圖模型在當代數據分析中的創新應用&#xff0c;通過開源工具bnlea…

WX小程序

下載 package com.sky.utils;import com.alibaba.fastjson.JSONObject; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.Cl…

Vulnhub-wordpress通關攻略

姿勢一、后臺修改模板拿WebShell 第一步&#xff1a;進?Vulhub靶場并執?以下命令開啟靶場&#xff1b;在瀏覽器中訪問并安裝好.... 第二步&#xff1a;找到外觀--編輯--404.php&#xff0c;將原內容刪除并修改為一句話木馬&#xff0c;點擊更新--File edited successfully. &…

Spring Boot(十六):攔截器Interceptor

攔截器的簡介 攔截器&#xff08;Interceptor&#xff09;?是Spring框架中的概?念&#xff0c;它同樣適?用于Spring Boot&#xff0c;?因為Spring Boot是基于Spring框架的。攔截器是?一種AOP&#xff08;面向切面編程&#xff09;?的輕量級實現方式&#xff0c;它允許我…

Kotlin v2.1.20 發布,標準庫又有哪些變化?

大家吼哇&#xff01;就在三小時前&#xff0c;Kotlin v2.1.20 發布了&#xff0c;更新的內容也已經在官網上更新&#xff1a;What’s new in Kotlin 2.1.20 。 我粗略地看了一下&#xff0c;下面為大家選出一些我比較感興趣、且你可能也會感興趣的內容。 注意&#xff01;這里…

開源鏈動2+1模式、AI智能名片與S2B2C商城小程序源碼在社交電商渠道拓寬中的協同應用研究

摘要&#xff1a;本文基于"開源鏈動21模式""AI智能名片""S2B2C商城小程序源碼"三大技術要素&#xff0c;探討社交電商時代商家渠道拓寬的創新路徑。通過解析各技術的核心機制與應用場景&#xff0c;結合京東便利店等實際案例&#xff0c;論證其對…

【藍橋杯速成】| 10.回溯切割

前面兩篇內容我們都是在做有關回溯問題的組合應用 今天的題目主題是&#xff1a;回溯法在切割問題的應用 題目一&#xff1a;分割回文串 問題描述 131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 給你一個字符串 s&#xff0c;請你將 s 分割成一些 子串&#xff…

【嵌入式硬件】三款DCDC調試筆記

關于開關電源芯片&#xff0c;重點關注輸入電源范圍、輸出電流、最低壓降。 1.MP9943: 以MP9943為例&#xff0c;輸入電壓范圍4-36V&#xff0c;輸出最大電流3A&#xff0c;最低壓降為0.3V 調整FB使正常輸出為5.06V 給定6V空載、5V空載、5V帶2A負載的情況&#xff1a; 6V帶2A…

2025年03月18日柯萊特(外包寧德)一面前端面試

目錄 自我介紹你怎么從0到1搭建項目的webpack 的構建流程手寫webpack插件你有什么想問我的嗎 2. 你怎么從 0 到 1 搭建項目的 在面試中回答從 0 到 1 搭建前端項目&#xff0c;可按以下詳細步驟闡述&#xff1a; 1. 項目前期準備 需求理解與分析 和產品經理、客戶等相關人…

在vitepress中使用vue組建,然后引入到markdown

在 VitePress 中&#xff0c;每個 Markdown 文件都被編譯成 HTML&#xff0c;而且將其作為 Vue 單文件組件處理。這意味著可以在 Markdown 中使用任何 Vue 功能&#xff0c;包括動態模板、使用 Vue 組件或通過添加 <script> 標簽為頁面的 Vue 組件添加邏輯。 值得注意的…

Jupyter Notebook 常用命令(自用)

最近有點忘記了一些常見命令&#xff0c;這里就記錄一下&#xff0c;懶得找了。 文章目錄 一、文件操作命令1. %cd 工作目錄2. %pwd 顯示路徑3. !ls 列出文件4. !cp 復制文件5. !mv 移動或重命名6. !rm 刪除 二、代碼調試1. %time 時間2. %timeit 平均時長3. %debug 調試4. %ru…

Java面試黃金寶典12

1. 什么是 Java 類加載機制 定義 Java 類加載機制是 Java 程序運行時的關鍵環節&#xff0c;其作用是把類的字節碼文件&#xff08;.class 文件&#xff09;加載到 Java 虛擬機&#xff08;JVM&#xff09;中&#xff0c;并且將字節碼文件轉化為 JVM 能夠識別的類對象。整個類…

第十四章:模板實例化_《C++ Templates》notes

模板實例化 核心知識點解析多選題設計題關鍵點總結 核心知識點解析 兩階段查找&#xff08;Two-Phase Lookup&#xff09; 原理&#xff1a; 模板在編譯時分兩個階段處理&#xff1a; 第一階段&#xff08;定義時&#xff09;&#xff1a;檢查模板語法和非依賴名稱&#xff0…

LSM-Tree(Log-Structured Merge-Tree)詳解

1. 什么是 LSM-Tree? LSM-Tree(Log-Structured Merge-Tree)是一種 針對寫優化的存儲結構,廣泛用于 NoSQL 數據庫(如 LevelDB、RocksDB、HBase、Cassandra)等系統。 它的核心思想是: 寫入時只追加寫(Append-Only),將數據先寫入內存緩沖區(MemTable)。內存數據滿后…

LangChain組件Tools/Toolkits詳解(6)——特殊類型注解Annotations

LangChain組件Tools/Toolkits詳解(6)——特殊類型注解Annotations 本篇摘要14. LangChain組件Tools/Toolkits詳解14.6 特殊類型注解Annotations14.6.1 特殊類型注解分類14.6.1 InjectedToolArg構建運行時綁定值工具14.6.3 查看并傳入參數14.6.4 在運行時注入參數14.6.5 其它特…

openharmony中hilog實證記錄說明(3.1和5.0版本)

每次用這個工具hilog都有一些小用法記不清&#xff0c;需要花一些時間去查去分析使用方法&#xff0c;為了給豐富多彩的生活留出更多的時間&#xff0c;所以匯總整理共享來了&#xff0c;它來了它來了~~~~~~~~~ 開始是想通過3.1來匯總的&#xff0c;但實際測試發現openharmony…

NVIDIA nvmath-python:高性能數學庫的Python接口

NVIDIA nvmath-python&#xff1a;高性能數學庫的Python接口 NVIDIA nvmath-python是一個高性能數學庫的Python綁定&#xff0c;它為Python開發者提供了訪問NVIDIA優化數學算法的能力。這個庫特別適合需要高性能計算的科學計算、機器學習和數據分析應用。 文章目錄 NVIDIA nv…

【euclid】20 2D包圍盒模塊(box2d.rs)

box2d.rs文件定義了一個二維軸對齊矩形&#xff08;Box2D&#xff09;&#xff0c;使用最小和最大坐標來表示。矩形在坐標類型&#xff08;T&#xff09;和單位&#xff08;U&#xff09;上是泛型的。代碼提供了多種方法來操作和查詢矩形&#xff0c;包括求交集、并集、平移、縮…