C#之 通过实例理解多态

        在面向对象编程中,用继承来模拟现实事物的分类特性,用接口来模拟现实事物的性质与行为特性,可以将基类和接口变量看成是一种“普遍性”的东西,而具体子类和实现接口的类则是一种“特殊性”的东西。

这种具有“普遍性”的编程方式,就是“多态编程”

多态编程的基本原理是:

使用基类或接口变量编程

在多态编程中,基类一般都是抽象基类,其中拥有一个或多个抽象方法,各个子类可以根据需要重写这些方法。或者使用接口,为每个接口定义一个或多个方法,由实现接口的类根据实际需要提供这些方法的具体实现。

因此多态的实现分为两大基本类别:继承多态和接口多态。

0.1 通过继承实现多态

假设动物园管理员每天需要给他所负责饲养的狮子、猴子和鸽子喂食。我们用一个程序来模拟他喂食的过程。

首先,建立三个类Lion、Monkey、Pigeon分别代表三种动物。饲养员用一个Feeder类来表示。由于三种动物吃的东西不一样,Feeder类就必须拥有三个喂动物的公有方法。如下

Monkey m = new Monkey();
Pigeon p = new Pigeon();
Lion l = new Lion();
Feeder f = new Feeder() { Name = "小李" }
f.FeedMonkey();    // 喂猴子
f.FeedPigeon();    // 喂鸽子
f.FeedLion();    // 喂狮子

如果动物园领导又把大熊猫交给他管理。这时不得不给Feeder类增加第四个方法 FeedPanda。

这种编程方式显然是不合理的,可以应用多态的方法解决。

狮子、猴子和鸽子都是动物,因此可以建立一个Animal抽象基类,让狮子、猴子和鸽子从其派生出来。

 

由于不同动物吃不同食物,在Animal类中定义一个抽象的Eat方法,由子类负责实现此方法。

现在将Feeder类的三个喂养方法合并为一个:

class Feeder
{
    public String Name;
    public void FeedAnimal (Animal animal)
    {
        animal.Eat();    // 不同的动物吃不同的食物
    }
}

喂养过程变为:

Monkey m = new Monkey();
Pigeon p = new Pigeon();
Lion l = new Lion();
Feeder f = new Feeder() { Name = "小李" }
f.FeedAnimal(m);    // 喂猴子
f.FeedAnimal(p);    // 喂鸽子
f.FeedAnimal(l);    // 喂狮子

上述代码中有连续三句的动物喂养语句,要想办法改进。
修改Feeder类的定义,给其增加一个新方法FeedAnimals,新方法完成的功能是喂养一群动物,它接收一个类型为Animal的数组。

class Feeder
{
    public void FeedAnimals (Animal[] ans)
    {
        foreach (Animal an in ans)
            an.Eat();    // 不同动物吃不同食物
    }
}

// 喂养过程代码如下:
Animal[] anx = { new Monkey(), new Pigeon(), new Lion() };
Feeder f = new Feeder();
f.Name = "小李";
f.FeedAnimals(ans);

上述代码中数组ans的元素类型为Animal,可以在其中存入任何一个Animal的子类对象。具有这种特性的数组称为“多态数组”。

同样也有接口实现多态,类似以上

接口多态与继承多态其编程方式与作用都是类似的,但由于一个类可以实现多个接口,所以接口多态较继承多态更灵活,因而在编程中也用得更广。

应用继承实现对象的统一管理。

应用接口定义对象的行为特性。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值