构造类
在面向对象语言中,大量的工作都是在对象中执行的。即使一个最简单的应用程序也需要构造一个或多个自定义类,这些类中包含执行任务相关的多个属性和方法。
首先看什么是继承?
.NET Framework中有近千个类,每个类中有许多不同的方法和属性。如果.NET Framework没有达到相当的一致性,要追踪查询到所有的这些类和成员是不可能的。比如,每个类都有一个ToString()方法执行同样的任务---把一个对象实例转化成字符串。
类似的,许多类支持同样的操作,比如比较一个类的两个实例是否相等。
继承和接口使这种一致性成为可能。
通过继承从一个现有的类创建一个新类。
比如我们可以轻松的通过继承System.ApplicationException类来创建自己的自定义异常类。
class DerivedException:System.ApplicationException
{
public override string Message
{
get{ return "An error occurred in the application." }
}
}
这样我们就可以抛出和捕获这个新的异常,因为它继承了它基类的所有行为。
try
{
throw new DeriveException();
}
catch (DerivedException ex)
{
Console.WriteLine("Source:{0},Error:{1}",ex.Source,ex.Message);
}
注意:用户自定义的异常类不仅支持throw/catch 行为,它还包括了继承自System.ApplicationException的一个源码成员变量。
继承的另外一个好处在于我们可以互换的使用子类。
比如,有5个继承自System.Drawing.Brush基类的类:HatchBrush, LinearGradienBrush, PathGradientBrush, SolidBrush and TextureBrush。
Graphics.DrawRectangle方法需要一个Brush对象作为参数,然而你可以不传Brush基类给它,而是传递任何一个子类给它,这里的任何一个子类它都能被它接收。
类似的,你也可以定义一个继承自Brush基类的自定义类传递给该方法。
什么是接口?
接口又叫做合同或契约,它定义了实现它所有类必须提供具体实现的一系列通用的成员。
比如:IComparable接口定义的CompareTo方法可以使两个类的实例进行相等性比较。
所有实现了该接口的类无论是用户自定义的还是.NET Framework内部类都将具有相等性比较。
接口IDisposable 提供了唯一的方法Dispose,使程序集创建的对象能够自由释放该对象使用的任何资源。
.NET Framework中常用的接口
IComparable ------ 实现它的类可以对其值进行排序,如数字和字符串类。
IDisposable ------ 定义了手动释放一个将对象的方法,这个接口对较大的对象或访问对象时加锁(如数据库访问)的情况比较重要。
IConvertible ----- 实现它的类可以转换成一个基本的数据类型如布尔型,字节型,字符串型等。
ICloneable ------- 支持对象拷贝功能
IEquatable ------- 允许你直接比较类的两个实例对象是否相等。
IFormattable ----- 允许我们将一个对象的值转换成特定格式的字符串。
我们同样也可以创建自己的接口。这在我们需要创建多个具有类似行为的类并互换使用时非常有用。
如:
interface IMessage
{
bool Send();
string Message { get; set; }
string Address { get; set; }
}
类可以实现多个接口,因此,一个类可以同时实现IComparable和IDisposable接口。
什么是部分类?
部分类允许我们把一个类的定义分拆到多个源文件中。这样的好处就是可以隐藏一些类定义的细节而使子类可以将关注点放在更重要的部分。Windows Form类就是一个内建部分类的例子。它的设计内容包含在一个叫form.Designer.cs源文件中,我们几乎就不用关心它的内容了,而是不主要精力放在事务逻辑的处理上。