抽象类
在上一篇文章里,我们知道基类里的函数能够被重写,那么要是在一个程序里,他的函数在每个子类里全部都要被重写,该基类的函数可不可以不去实现,只定义一个函数呢?
我们可以定义一个抽象函数,抽象函数只有函数定义没有函数体,可以说抽象函数本身也是虚拟的virtual(只有函数,没有函数体实现)
当一个类里有抽象函数的时候,这个类也必须是抽象类,抽象类不能实例化,但是抽象类可以同时有普通函数和抽象函数。
在前面我们说过类相当于一个模板,所以抽象类就是一个不完整的模板,我们不能够使用不完整的模板去构造对象。定义一个抽象类需要abstract关键字。
abstract class Building{
public abstract decimal CalculateHeatingCost();
}
有几点需要注意的是
- 当我们继承了一个抽象类的时候,我们必须去实现抽象类里的抽象方法。
- 因为抽象的方法没有函数体,所有一般情况下每个子类的方法都是不同的。
- 在声明和构造对象的时候,抽象类可以声明对象,但是不能用于构造对象。
一个抽象类的继承实例
abstract class Bird
{
private float speed;
public void Eat()
{
}
public abstract void Fly();
}
class Crow:Bird
{
public override void Fly()
{
Console.WriteLine("乌鸦在飞行");
}
}
密封方法
在C#中,允许把类和方法声明为sealed。对于类来说,这表示不能够继承该类;对于方法来说,表示不能重写该方法。
语法规则
sealed FinalClass{
//etc.
}
密封类和密封方法的作用:防止重写某些类导致代码混乱;商业原因。
//sealed class BaseClass
class BaseClass
{
public virtual void Move()
{
}
}
class DerivedClass:BaseClass //密封类无法被继承
{
public sealed override void Move() //只能密封重写的方法
{
}
}
这段代码中可以看出,sealed关键字可以加在类名前面,但是在方法上只能加在重写方法前面,而且密封类是无法被继承的 。密封类在我们写程序的过程中几乎用不到。