C#基礎知識整理:基礎知識(6) 抽象類別和抽象方法

來源:互聯網
上載者:User
在實際項目中,當我們設計一個父類時,經常會遇到這個類不能確定它的具體執行流程的。比如我設計一個檔案類:

  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)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.