在实际项目中,当我们设计一个父类时,经常会遇到这个类不能确定它的具体执行流程的。比如我设计一个文件类:
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#还有许多其他特性,如反射、匿名方法、Lambda表达式、动态类型、元数据等。对于深入学习,可以参考“第二周第三天项目.rar”中的实例代码,以及"M1W2D3.txt"和"复习.txt"中可能...
【C#基础知识】 C#(读作"C sharp")是一种面向对象的编程语言,由微软公司为.NET框架开发。它的设计目标是提供一种简洁、类型安全、高效且现代的编程语言,用于构建Windows桌面应用程序、Web应用程序以及移动平台...
C#是一种面向对象的编程语言,由微软开发,...以上是C#基础的概览,涵盖了类型系统、内存管理、类和对象、继承与接口、方法等关键概念。深入学习C#还需要了解更多的特性,如属性、事件、异常处理、泛型、异步编程等。
通过深入理解这些C#的基础知识,特别是与基类Object相关的部分,开发者可以更好地设计和实现复杂的程序。编程不仅是一门技术,也是一种艺术,不断学习和实践是提升技能的关键。让我们继续探索,创造更多美好的编程...
C#是一种广泛应用于软件开发的面向对象的...通过学习和实践这些C#基础知识,你可以更好地理解和编写C#应用程序,为进阶学习和项目开发打下坚实基础。不断探索C#的更多高级特性和应用场景,将使你在IT领域更上一层楼。
6. **接口与抽象类**:接口定义了一组方法签名,实现了接口的类必须实现这些方法。抽象类可以包含抽象方法和属性,不能被实例化,但可以被其他类继承。 7. **异常处理**:C#使用try-catch-finally语句块来处理运行...
在C#编程语言中,"隐藏...综上所述,"C#基础知识 隐藏"可能涵盖了类的封装性、继承和多态等核心概念,以及实际项目中常见的文件组织结构。通过深入理解和熟练应用这些知识点,开发者可以编写出高效、可维护的C#代码。
以上只是C#基础知识的一部分,实际学习过程中,还需要了解更多的高级特性,如委托、事件、匿名方法、Lambda表达式、匿名类型、动态类型、扩展方法、元数据等。C#是一个不断发展和演进的语言,随着.NET Core的推出,...
通过了解这些知识点,你将能更好地理解和利用C#抽象类来设计高效、可扩展的软件架构。 首先,抽象类是一种不能被实例化的类,它只能作为其他类的基类来使用。在C#中,我们使用`abstract`关键字来声明一个类为抽象类...
- 进阶学习可能涉及更复杂的主题,如泛型、委托、事件、接口、抽象类、异步编程、LINQ以及.NET框架的其他服务。 5. **开发环境** - 微软的Visual Studio IDE提供了强大的C#开发环境,包括代码编辑、调试、构建和...
本“C#基础知识案例”旨在深入浅出地介绍C#的关键概念和技术,帮助初学者快速掌握这门语言。 1. **基础语法** - 变量声明:C#中的变量需要先声明后使用,支持多种数据类型,如int、double、string等。 - 控制结构...
以上就是C#常用的知识点,掌握这些基础知识将有助于你构建和维护高质量的C#应用程序。在实际编程过程中,还需要不断学习和理解更高级的主题,如并发处理、单元测试、设计模式等,以提升专业技能。
本文将深入探讨C#的基础知识、编程规范,特别是关于数组的相关内容,同时也涵盖类、接口、虚方法和抽象方法、值类型和引用类型的区别。 首先,C#的基础知识包括变量、数据类型、控制流(如if语句和循环)、函数等。...
一、C#基础语法 1. 变量和数据类型:C#有多种内置数据类型,如整型(int、byte等)、浮点型(float、double)、字符型(char)、布尔型(bool)以及字符串型(string)。变量在声明时必须指定数据类型,并遵循强类型...
本“C#基础知识编程实例”旨在通过一系列实例深入浅出地讲解C#的核心概念和技术,帮助初学者快速掌握这门语言。 一、C#基础语法 C#的语法结构类似于C++和Java,它有严格的类型检查和垃圾回收机制。实例中可能涵盖...
以下是对标题和描述中涉及的一些C#基础知识的详细解释: 1. 静态变量与非静态变量的区别: 静态变量属于类,而非静态变量属于类的实例。静态变量在类加载时初始化,所有实例共享同一静态变量的值。而非静态变量在...
这里我们将深入探讨C#的一些基础知识,包括类、继承、访问修饰符、构造函数、重载和覆写、抽象类与接口以及字符串处理。 1. **属性的set方法**:在C#中,当你定义一个属性时,可以通过set方法设置其值。set方法有一...
- **类与对象**:掌握面向对象编程的基本概念,如封装、继承、多态和抽象。 2. **.NET框架**: - ** Xamarin.Forms**:用于跨平台UI开发,通过单一的代码库支持iOS、Android和Windows Phone。 - **XAML**:一种...
C#是一种广泛应用于软件开发,尤其是游戏开发、桌面应用、移动应用和Web应用的编程语言。它由微软公司于2000年推出,作为.NET框架...无论你是编程新手还是希望巩固C#基础知识的开发者,这本书都将是你宝贵的参考资料。
总结来说,C#.NET基础知识涵盖了.NET Framework的结构、C#的数据类型和内存管理、方法的重载与覆盖、多态性以及委托和事件。理解并掌握这些知识对于C#开发者至关重要,它们构成了编写高效、安全、可维护的C#代码的...