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


実際のプロジェクトでは、親クラスを設計するときに、このクラスが特定の実行プロセスを特定できないことがよくあります.たとえば、ファイルクラスを設計します.
  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の方法は、どのように書くべきですか?ファイルには4つのステータスがあり、必要に応じて追加される可能性があります.異なるファイルタイプに対して、コピー方法は異なり、プロジェクトの必要に応じて特定のファイルに対して特別な処理を行う可能性があります.このようにしてこの親クラスを設計する場合、copyメソッドにコードを書くことはできません.それを継承する人だけがこのメソッドを書き直し、必要に応じて異なる実行コードを書く必要があります.このように、クラスにはメソッドがありますが、このメソッドにはプロシージャが具体的に実行されていません.このメソッドを「抽象メソッド」と呼びます.上のAFileクラスではCopyメソッドを抽象メソッドと呼ぶが,このAFileクラスをインスタンス化すると,Copyメソッドはこのオブジェクトの挙動であるが,実際にはCopyメソッドはまだ確定していないという問題がある.これは客観的な事物の法則に合わない.したがって,このクラスはインスタンス化できない,すなわちクラスに抽象的な方法がある場合,このクラスはインスタンス化できない,というクラスを「抽象クラス」と呼ぶ.抽象はインスタンス化できませんが、クラスです.抽象クラスと抽象メソッドはabstractキーワードで修飾されます.抽象クラスには、抽象メソッドと非抽象メソッドの2つのメソッドが存在することがわかります.非抽象メソッドは、抽象クラスが継承され、サブクラスは非抽象メソッドを持ち、直接使用したり、上書きしたりすることができます.抽象クラス、上書きを上書きする必要があります.上記のファイルクラスを変更します.
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キーワードを使用して抽象クラスとして定義することもできます.これは、クラスが抽象化されず、継承されなければならないことを示しています.