抽象类
在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的
类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但
是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在
着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在
问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以
用以表征抽象概念的抽象类是不能够实例化的。在面向对象领域,抽象类主要用来进行类型隐藏。我们可
以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象
描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体
。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可
扩展此模块的行为功能。
在C#中一种类专门用来作为父类,这种类就是“抽象类”(abstract class)。抽象类有点类似“模板”
的作用,其目的是要依据它的格式来修改并创建新的类。但是并不能由抽象类创建对象,只能通过抽象类
派生出新的类,再由它来创建对象。抽象类的定义语法中,method的定义可分为两种:一种是一般的
method,它和普通类的方法没什么区别。另一种是"抽象方法"(abstract method)。它是以abstract关键
字为开头的method,此method只声明了返回值的数据类型、method名称与所需的参数,但没有定义处理的
方式。
使用抽象类时注意
不能实例化
abstract关键字
子类必须重写
抽象类不能是sealed密封类。
若一个类中有一个抽象方法,那此类必须定义成抽象类。
抽象成员的访问修饰符不能为private。
实现抽象方法用override关键字。
抽象类可以被抽象类所继承,结果仍是抽象类。
... {
abstract public void BuildFrame();
abstract public void BuildEngine();
abstract public void BuildWheels();
abstract public void BuildDoors();
public void show()
...{
BuildFrame();
BuildEngine();
BuildWheels();
BuildDoors();
}
}
class MotorCycleBuilder : VehicleBuilder
... {
override public void BuildFrame()
...{
Console.WriteLine("MotorCycleBuildFrame");
}
override public void BuildEngine()
...{
Console.WriteLine("MotorCycleBuildEngine");
}
override public void BuildWheels()
...{
Console.WriteLine("MotorCycleBuildWheels");
}
override public void BuildDoors()
...{
Console.WriteLine("MotorCycleBuildDoors");
}
}
class ScooterBuilder : VehicleBuilder
... {
override public void BuildFrame()
...{
vehicle["frame"] = "Scooter Frame";
}
override public void BuildEngine()
...{
vehicle["engine"] = "none";
}
override public void BuildWheels()
...{
vehicle["wheels"] = "2";
}
override public void BuildDoors()
...{
vehicle["doors"] = "0";
}
}