首先举个例子
假设某动物园管理员每天需要给他所负责饲养的狮子、猴子和鸽子喂食。我们用一个程序来模拟他喂食的过程。
先用常规类编程方式
饲养员用一个 Feeder() 类来表示,三个动物分别是:class Monkey() ,class Pigeon() ,class Lion()
//饲养员类
class Feeder
{
void FeedMonkey(Monkey m)
{
m.eat()
}
...
...
...
}
饲养员喂食的过程如下:
static void Main(string[] args)
{
Monkey m = new Monkey();
Pigeon p = new Pigeon();
Lion l = new Lion();
Feeder f = new Feeder();
f.FeedMonkey(m); //喂猴子
f.FeedPigeon(p); //喂鸽子
f.FeedLion(l); //喂狮子
}
如果动物园领导看伺养员工作努力,又把大熊猫交给他管理。这时,我们的程序不得不给
Feeder 类增加第四个方法: FeedPanda()。
万一饲养员后来又不管理鸽子了,那不又得从 Feeder 类中删除 FeedPigeon()方法吗?
这种编程方式很明显是不合理的。
Feeder 类增加第四个方法: FeedPanda()。
万一饲养员后来又不管理鸽子了,那不又得从 Feeder 类中删除 FeedPigeon()方法吗?
这种编程方式很明显是不合理的。
很明显,狮子、猴子和鸽子都是一种动物,因此,可以建立一个 Animal 抽象基类,让狮子、猴子和鸽子从其派生出来
由于不同的动物吃不同的食物,所以在 Animal 类中定义一个抽象的 eat()方法,由子类负责实现此方法。
abstract class Animal
{
public abstract void eat();
}
//狮子
class Lion:Animal
{
public override void eat()
{
//吃肉
}
}
//猴子
class Monkey:Animal
{
public override void eat()
{
//吃香蕉
}
}
//鸽子
class Pigeon:Animal
{
public override void eat()
{
//吃大米
}
}
伺养员类如下:
//动物园饲养员
class Feeder
{
//抽象类做为参数(同样也可以是接口参数)
public void FeedAnimal(Animal animals)
{
animals.eat();
}
}
现在喂养过程变为:
static void Main(string[] args)
{
Monkey m = new Monkey();
Pigeon p = new Pigeon();
Lion l = new Lion();
Feeder f = new Feeder();
f.FeedAnimal(m);//喂猴子
f.FeedAnimal(p);//喂鸽子
f.FeedAnimal(l);//喂狮子
}
简化后的代码变得非常简洁。对比最早的使用三个独立方法实现的方法,新代码扩展性大大增强。不管有几种动物,只需要创建动物类,饲养员 Feeder 类的 FeedAnimals 方法不用改就可以使用。
还一个好处就是在项目的开始期,设计好抽象类Animal,不必等到各子类完成eat()等方法,大家就可以协同工作了。
以上大家可以明白为什么使用抽象类编程或者使用抽象类编程的好处了吧。
以上大家可以明白为什么使用抽象类编程或者使用抽象类编程的好处了吧。