Maison >développement back-end >Tutoriel C#.Net >Compilation des connaissances de base C# : connaissances de base (6) classes abstraites et méthodes abstraites

Compilation des connaissances de base C# : connaissances de base (6) classes abstraites et méthodes abstraites

黄舟
黄舟original
2017-02-11 13:14:301286parcourir

Dans les projets réels, lorsque nous concevons une classe parent, nous constatons souvent que la classe ne peut pas déterminer son processus d'exécution spécifique. Par exemple, je conçois une classe de fichier :

  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//压缩的
    }

Ceci est une classe parent Comment dois-je écrire sa méthode de copie ? Étant donné que les fichiers existent dans quatre états et peuvent être ajoutés ultérieurement si nécessaire, les méthodes de copie sont différentes pour différents types de fichiers et un traitement spécial peut être effectué pour certains fichiers en fonction des besoins du projet. De cette façon, lors de la refonte de cette classe parent, vous ne pouvez pas écrire de code pour la méthode de copie. Seul celui qui en hérite peut remplacer cette méthode et écrire des codes d'exécution différents selon les besoins.
De cette façon, une classe a une certaine méthode, mais la méthode n'a pas de processus d'exécution spécifique. Une telle méthode est appelée « méthode abstraite ».
La méthode Copy dans la classe AFile ci-dessus est appelée une méthode abstraite, mais il y a un problème si la classe AFile est instanciée, la méthode Copy sera le comportement de cet objet, mais en fait la méthode Copy n'est pas sûre. encore. Cela est incompatible avec les lois objectives des choses. Par conséquent, cette classe ne peut pas être instanciée, ce qui signifie que lorsqu'il y a une méthode abstraite dans la classe, cette classe ne peut pas être instanciée. Une telle classe est appelée « classe abstraite ». Abstract ne peut pas être instancié, mais c'est toujours une classe. Les classes abstraites et les méthodes abstraites sont modifiées avec le mot-clé abstract.
Comme vous pouvez le constater, il existe deux méthodes dans les classes abstraites : les méthodes abstraites et les méthodes non abstraites.
Méthodes non abstraites, les classes abstraites sont héritées, les sous-classes ont des méthodes non abstraites, qui peuvent être utilisées directement ou remplacées.
Classe abstraite, doit être remplacée et réécrite.
Modifiez la classe de fichiers ci-dessus :

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{}
        }
    }

}

De cette façon, l'héritage et l'implémentation de la classe abstraite sont terminés. Mais si la sous-classe hérite de la classe abstraite mais n'implémente pas la méthode abstraite, alors la sous-classe existera également en tant que classe abstraite. Une classe avec des méthodes abstraites est appelée classe abstraite. Dans certains cas, une classe sans méthodes abstraites peut également être définie comme une classe abstraite à l'aide du mot-clé abstract, qui indique que la classe ne peut pas être abstraite et doit être héritée.

Ce qui précède est le résumé des connaissances de base de C# : Connaissances de base (6) Classes abstraites et méthodes abstraites Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn). !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn