在一个类前面加上“abstract”关键字,此类就成为了抽象类。一个方法类前面加上“abstract”关键字,此方法就成为了抽象方法。
抽象类一般用于表达一种比较抽象的事物,比如前面所说的“水果”,而抽象方法则说明此抽象类应该具有的某种性质,比如Fruit 类中有一个抽象方法GrowInArea(),说明水果一定有一个最适合其生长的地区,但不同的水果生长地是不同的。
abstract class Fruit //抽象类
{
public abstract void GrowInArea(); //抽象方法不能有实现代码,在函数名后直接跟一个分号。
}
抽象类专用于派生出子类,子类必须实现抽象类所声明的抽象方法,否则,子类仍是抽象类。
从同一抽象类中继承的子类拥有相同的方法(即抽象类所定义的抽象方法),但这些方法的具体代码每个类都可以不一样。
class Apple : Fruit //苹果
{
public override void GrowInArea()
{
Console.WriteLine("南方北方都可以种植我。");
}
}
class Pineapple : Fruit //菠萝
{
public override void GrowInArea()
{
Console.WriteLine("我喜欢温暖,只能在南方看到我。");
}
}
注意上述代码中的override 关键字,这说明子类重写了基类的抽象方法。抽象类不能创建对象,一般用它来引用子类对象。
Fruit f;
f = new Apple();
f.GrowInArea();
f = new Pineapple();
f.GrowInArea();
运行结果:
南方北方都可以种植我。
我喜欢温暖,只能在南方看到我。
注意同一句代码“f.GrowInArea();”会由于f 所引用的对象不同而输出不同的结果。可以看到,代码运行结果类似于上一节介绍的“虚方法调用”,两者没有本质差别。
可以按照以下公式编写代码:
抽象类 抽象类变量名=new 继承自此抽象类的具体子类名();
一个抽象类中可以包含非抽象的方法和字段。因此:包含抽象方法的类一定是抽象类,但抽象类中的方法不一定是抽象方法。
除了方法可以是抽象的之外,属性也可以是抽象的,请看以下代码:
abstract class Parent
{
public abstract String Message //抽象属性
{
get;
set;
}
}
class Child : Parent
{
private String _msg;
public override String Message
{
get
{
return _msg;
}
set
{
_msg=value;
}
}
}
使用代码:
Parent p = new Child();
p.Message = "Hello";