在實際項目中,當我們設計一個父類時,經常會遇到這個類不能確定它的具體執行流程的。比如我設計一個檔案類:
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) 抽象類別和抽象方法 的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!