`
zhangziyangup
  • 浏览: 1187434 次
文章分类
社区版块
存档分类
最新评论

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方法,应该怎么写呢?因为文件存在四种状态甚至后来根据需要还可能再加,针对不同的文件类型,拷贝方法是不一样的,而且根据项目需要还可能针对某种文件做一些特殊处理。这样再设计这个父类时就不能对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#基础知识

    以上只是C#基础知识的一部分,实际上C#还有许多其他特性,如反射、匿名方法、Lambda表达式、动态类型、元数据等。对于深入学习,可以参考“第二周第三天项目.rar”中的实例代码,以及"M1W2D3.txt"和"复习.txt"中可能...

    c#汇总,包括asp.net xml c#基础知识

    【C#基础知识】 C#(读作"C sharp")是一种面向对象的编程语言,由微软公司为.NET框架开发。它的设计目标是提供一种简洁、类型安全、高效且现代的编程语言,用于构建Windows桌面应用程序、Web应用程序以及移动平台...

    c#基础知识概述(WORD文档)

    C#是一种面向对象的编程语言,由微软开发,...以上是C#基础的概览,涵盖了类型系统、内存管理、类和对象、继承与接口、方法等关键概念。深入学习C#还需要了解更多的特性,如属性、事件、异常处理、泛型、异步编程等。

    C#基础知识 基类Object

    通过深入理解这些C#的基础知识,特别是与基类Object相关的部分,开发者可以更好地设计和实现复杂的程序。编程不仅是一门技术,也是一种艺术,不断学习和实践是提升技能的关键。让我们继续探索,创造更多美好的编程...

    c#基础知识个人总结

    C#是一种广泛应用于软件开发的面向对象的...通过学习和实践这些C#基础知识,你可以更好地理解和编写C#应用程序,为进阶学习和项目开发打下坚实基础。不断探索C#的更多高级特性和应用场景,将使你在IT领域更上一层楼。

    C#基础知识课件PPT2

    6. **接口与抽象类**:接口定义了一组方法签名,实现了接口的类必须实现这些方法。抽象类可以包含抽象方法和属性,不能被实例化,但可以被其他类继承。 7. **异常处理**:C#使用try-catch-finally语句块来处理运行...

    C#基础知识 隐藏

    在C#编程语言中,"隐藏...综上所述,"C#基础知识 隐藏"可能涵盖了类的封装性、继承和多态等核心概念,以及实际项目中常见的文件组织结构。通过深入理解和熟练应用这些知识点,开发者可以编写出高效、可维护的C#代码。

    C#基础C#基础C#基础

    以上只是C#基础知识的一部分,实际学习过程中,还需要了解更多的高级特性,如委托、事件、匿名方法、Lambda表达式、匿名类型、动态类型、扩展方法、元数据等。C#是一个不断发展和演进的语言,随着.NET Core的推出,...

    C#抽象类特点.zip

    通过了解这些知识点,你将能更好地理解和利用C#抽象类来设计高效、可扩展的软件架构。 首先,抽象类是一种不能被实例化的类,它只能作为其他类的基类来使用。在C#中,我们使用`abstract`关键字来声明一个类为抽象类...

    C#基础知识:入门与提高的最佳资料

    - 进阶学习可能涉及更复杂的主题,如泛型、委托、事件、接口、抽象类、异步编程、LINQ以及.NET框架的其他服务。 5. **开发环境** - 微软的Visual Studio IDE提供了强大的C#开发环境,包括代码编辑、调试、构建和...

    C#基础知识案例

    本“C#基础知识案例”旨在深入浅出地介绍C#的关键概念和技术,帮助初学者快速掌握这门语言。 1. **基础语法** - 变量声明:C#中的变量需要先声明后使用,支持多种数据类型,如int、double、string等。 - 控制结构...

    C#常用知识整理

    以上就是C#常用的知识点,掌握这些基础知识将有助于你构建和维护高质量的C#应用程序。在实际编程过程中,还需要不断学习和理解更高级的主题,如并发处理、单元测试、设计模式等,以提升专业技能。

    C#基础知识 c#编程规范 数组

    本文将深入探讨C#的基础知识、编程规范,特别是关于数组的相关内容,同时也涵盖类、接口、虚方法和抽象方法、值类型和引用类型的区别。 首先,C#的基础知识包括变量、数据类型、控制流(如if语句和循环)、函数等。...

    C#基础理论知识总结

    一、C#基础语法 1. 变量和数据类型:C#有多种内置数据类型,如整型(int、byte等)、浮点型(float、double)、字符型(char)、布尔型(bool)以及字符串型(string)。变量在声明时必须指定数据类型,并遵循强类型...

    C#基础知识编程实例

    本“C#基础知识编程实例”旨在通过一系列实例深入浅出地讲解C#的核心概念和技术,帮助初学者快速掌握这门语言。 一、C#基础语法 C#的语法结构类似于C++和Java,它有严格的类型检查和垃圾回收机制。实例中可能涵盖...

    c#基础知识25个常见问题.pdf

    以下是对标题和描述中涉及的一些C#基础知识的详细解释: 1. 静态变量与非静态变量的区别: 静态变量属于类,而非静态变量属于类的实例。静态变量在类加载时初始化,所有实例共享同一静态变量的值。而非静态变量在...

    C# 基础知识问答!!!!!!!!!

    这里我们将深入探讨C#的一些基础知识,包括类、继承、访问修饰符、构造函数、重载和覆写、抽象类与接口以及字符串处理。 1. **属性的set方法**:在C#中,当你定义一个属性时,可以通过set方法设置其值。set方法有一...

    c#手机编程基础知识

    - **类与对象**:掌握面向对象编程的基本概念,如封装、继承、多态和抽象。 2. **.NET框架**: - ** Xamarin.Forms**:用于跨平台UI开发,通过单一的代码库支持iOS、Android和Windows Phone。 - **XAML**:一种...

    C#基础篇电子书讲解

    C#是一种广泛应用于软件开发,尤其是游戏开发、桌面应用、移动应用和Web应用的编程语言。它由微软公司于2000年推出,作为.NET框架...无论你是编程新手还是希望巩固C#基础知识的开发者,这本书都将是你宝贵的参考资料。

    C#.NET基础知识

    总结来说,C#.NET基础知识涵盖了.NET Framework的结构、C#的数据类型和内存管理、方法的重载与覆盖、多态性以及委托和事件。理解并掌握这些知识对于C#开发者至关重要,它们构成了编写高效、安全、可维护的C#代码的...

Global site tag (gtag.js) - Google Analytics