在實際專案中,當我們設計一個父類別時,常常會遇到這個類別不能確定它的具體執行流程的。例如我設計一個檔案類別:
public class AFile { private string name = string.Empty; private string path = string.Empty; private FileType type = FileType.IsUnknown; public string Name { get { return name; } } public string Path { get { return path; } } public FileType Type { get { return type; } } public AFile(string name, string path, FileType type) { this.name = name; this.path = path; this.type = type; } public void Copy(string destPath) { //不知道怎么写,因为可能是文件还可能是文件夹,如果是压缩的还要解压 } } public enum FileType { IsUnknown = 0,//类型不明 IsFile = 1,//文件 IsDirectory =2,//文件夹 IsCompression//压缩的 }
這是一個父類,它的copy方法,該怎麼寫呢?因為文件有四種狀態甚至後來根據需要還可能再加,針對不同的文件類型,拷貝方法是不一樣的,而且根據項目需要還可能針對某種文件做一些特殊處理。這樣再設計這個父類別時就不能對copy方法寫程式碼,只需要誰繼承它誰就重寫這個方法,根據需要寫不同的執行程式碼。
這樣,一個類別具有某個方法,但是該方法沒有具體執行過程,這樣的方法稱之為「抽象方法」。
上面的AFile類別中Copy方法就叫抽象方法,但是隨之有一個問題,如果實例化了這個AFile類,Copy方法也就是這個物件的行為了,但實際上Copy方法還不確定。這樣不符合客觀事物法則。因此,這個類別是不能被實例化的,也就是說當類別中有抽象方法時,這個類別不能被實例化,這樣的類別就稱為「抽象類別」。抽像不能被實例化,但它還是類別。抽象類別和抽象方法用abstract關鍵字修飾。
可以看到,抽象類別中就存在了兩種方法:抽象方法和非抽象方法。
非抽象方法,抽象類別被繼承,子類別有非抽象方法,可以直接使用,也可以重寫覆寫。
抽象類,必須覆寫重寫。
修改上述的檔案類別:
using System; using System.Collections.Generic; using System.Text; using System.IO; namespace YYS.CSharpStudy.MainConsole { public abstract class AFile { private string name = string.Empty; private string path = string.Empty; private FileType type = FileType.IsUnknown; public string Name { get { return name; } } public string AFilePath { get { return path; } } public FileType Type { get { return type; } } public AFile(string name, string path, FileType type) { this.name = name; this.path = path; this.type = type; } public abstract void Copy(string destPath); } public enum FileType { IsUnknown = 0,//类型不明 IsFile = 1,//文件 IsDirectory =2,//文件夹 IsCompression//压缩的 } /// <summary> /// 文件类 /// </summary> public class FileInfo : AFile { public FileInfo(string name, string path, FileType type) : base(name, path, type) { } /// <summary> /// 文件的拷贝方法 /// </summary> public override void Copy(string destPath) { if (string.IsNullOrEmpty(destPath)) { string sourcePath = this.AFilePath + this.Name; //此时name是文件名,带有后缀名,加起来是文件路径 destPath += this.Name; if (File.Exists(sourcePath)) { File.Copy(sourcePath, destPath, true); } } } } /// <summary> /// 文件夹类 /// </summary> public class FileDirectoryInfo : AFile { public FileDirectoryInfo(string name, string path, FileType type) : base(name, path, type) { } /// <summary> /// 文件的拷贝方法 /// </summary> public override void Copy(string destPath) { if (string.IsNullOrEmpty(destPath)) { string sourcePath = this.AFilePath + this.Name; //此时文件名是文件夹名,加起来是文件夹路径 destPath += this.Name; if (Directory.Exists(sourcePath)) { CopyDirectory(sourcePath, destPath); } } } /// <summary> /// 拷贝文件夹的方法 /// </summary> private void CopyDirectory(string sourcePath, string destPath) { try { if (!Directory.Exists(destPath)) { Directory.CreateDirectory(destPath); } DirectoryInfo directoryInfo = new DirectoryInfo(sourcePath); foreach (FileSystemInfo fileInfo in directoryInfo.GetFileSystemInfos()) { string subFileOrDirectoryName = Path.Combine(destPath, fileInfo.Name); if (fileInfo is DirectoryInfo) { this.CopyDirectory(fileInfo.FullName, subFileOrDirectoryName); } else { if (File.Exists(sourcePath)) { File.Copy(sourcePath, destPath, true); } } } } catch{} } } }
這樣,就完成了抽象類別的繼承並實現。但是如果子類別繼承了抽象類,但是並沒有實作抽象方法,那麼這個子類別也會作為一個抽象類別存在。有抽象方法的類別叫做抽象類,對於有些情況,沒有抽象方法的類,也可以使用abstract關鍵字定義為抽象類,這樣表示該類別不能被抽象,必須被繼承。
以上是C#基礎知識整理:基礎知識(6) 抽象類別與抽象方法 的內容,更多相關內容請關注PHP中文網(www.php.cn)!

C#和.NET通過不斷的更新和優化,適應了新興技術的需求。 1)C#9.0和.NET5引入了記錄類型和性能優化。 2).NETCore增強了雲原生和容器化支持。 3)ASP.NETCore與現代Web技術集成。 4)ML.NET支持機器學習和人工智能。 5)異步編程和最佳實踐提升了性能。

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

C#在.NET中的編程過程包括以下步驟:1)編寫C#代碼,2)編譯為中間語言(IL),3)由.NET運行時(CLR)執行。 C#在.NET中的優勢在於其現代化語法、強大的類型系統和與.NET框架的緊密集成,適用於從桌面應用到Web服務的各種開發場景。

C#是一種現代、面向對象的編程語言,由微軟開發並作為.NET框架的一部分。 1.C#支持面向對象編程(OOP),包括封裝、繼承和多態。 2.C#中的異步編程通過async和await關鍵字實現,提高應用的響應性。 3.使用LINQ可以簡潔地處理數據集合。 4.常見錯誤包括空引用異常和索引超出範圍異常,調試技巧包括使用調試器和異常處理。 5.性能優化包括使用StringBuilder和避免不必要的裝箱和拆箱。

C#.NET應用的測試策略包括單元測試、集成測試和端到端測試。 1.單元測試確保代碼的最小單元獨立工作,使用MSTest、NUnit或xUnit框架。 2.集成測試驗證多個單元組合的功能,常用模擬數據和外部服務。 3.端到端測試模擬用戶完整操作流程,通常使用Selenium進行自動化測試。

C#高級開發者面試需要掌握異步編程、LINQ、.NET框架內部工作原理等核心知識。 1.異步編程通過async和await簡化操作,提升應用響應性。 2.LINQ以SQL風格操作數據,需注意性能。 3..NET框架的CLR管理內存,垃圾回收需謹慎使用。

C#.NET面試問題和答案包括基礎知識、核心概念和高級用法。 1)基礎知識:C#是微軟開發的面向對象語言,主要用於.NET框架。 2)核心概念:委託和事件允許動態綁定方法,LINQ提供強大查詢功能。 3)高級用法:異步編程提高響應性,表達式樹用於動態代碼構建。

C#.NET是構建微服務的熱門選擇,因為其生態系統強大且支持豐富。 1)使用ASP.NETCore創建RESTfulAPI,處理訂單創建和查詢。 2)利用gRPC實現微服務間的高效通信,定義和實現訂單服務。 3)通過Docker容器化微服務,簡化部署和管理。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

記事本++7.3.1
好用且免費的程式碼編輯器