定义
一个类定义为抽象类是作为基类使用。这种类只能用于派生使用。比如从这个类派生其他类。我们不能通过这个类来创建对象。
一个类是抽象类由关键字abstract声明。抽象类的定义语法是
?
abstract class class-name
{
// members of the class
}
实现
抽象类一般包括有一个或者多个的抽象方法或者抽象属性。这些方法和属性不能直接被引用,但是我们派生类的时候必须进行重载这些方法和属性,以便派生类可以被实例化。在派生类中不重载那些方法及属性将会出现语法错误,除非派生的类也是一个抽象类。
在一些情况下,抽象类都是由一些继承体系中最顶层组成,比如例子中抽象类Shape具有一个抽象函数Draw()有二个抽象类Shape2D和Shape3D继承方法Draw(),而且并不提供该函数的引用。现在我们创建几个常用类Rectangle, Square和Circle从Shaper2D中继承,另外一组类Sphere, Cylinder和Cube重Shape3D中继承。所有在继承底层的类都必须重载抽象方法Draw().
?
public abstract class Shape
{
//...Class implementation
public abstract void Draw(int x, int y)
{
//this method mustn't be implemented here.
//If we do implement it, the result is a Syntax Error.
}
}
public abstract class Shape2D : Shape
{
//...Class implementation
//...you do not have to implement the the method Draw(int x, int y)
}
public class Cricle : Shape2D
{
//here we should provide an implemetation for Draw(int x, int y)
public override void Draw(int x, int y)
{
//must do some work here
}
}
抽象属性
下面是一个实现抽象属性的例子。
在上面的例子中,有一个保护成员声明在抽象类中。在派生类absDerived中则定义了成员变量myNumber的get/set属性。
?
//Abstract Class with abstract properties
abstract class absClass
{
protected int myNumber;
public abstract int numbers
{
get;
set;
}
}
class absDerived : absClass
{
//Implementing abstract properties
public override int numbers
{
get
{
return myNumber;
}
set
{
myNumber = value;
}
}
}
一些需要注意的地方
一个抽象类不能是一个密封的类
一个抽象方法不能被私有
一个抽象方法不能被virtual修饰,因为抽象方法本身隐式就是虚的了。
一个抽象方法不能是静态函数
抽象类的方法的修饰词必须跟其派生类中的方法修饰词一致。如果你声明了一个受保护的抽象方法,那么它在派生类中也必须被声明称保护的。否则编译器会报错。
抽象方法跟虚函数之间的不同点
虚函数可以被应用和在派生类中可以进行重载它。而抽象方法不能被直接应用,强制必须在派生类中进行重载它。
综述
在上面几点中我们讲了C#中的抽象类。抽象类是一个不能被直接实例化的类,但是它的后代能偶被直接实例化。 |