C#编程语言与面向对象—— 多态

时间:2023-02-15 14:14:33

多态编程的基本原理是:
使用基类或接口变量编程。

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

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

继承多态

设想动物园饲养员每天需要给他所负责死样的狮子、猴子和鸽子喂食。

首先,建立三个类分别代表三个动物

C#编程语言与面向对象—— 多态

饲养员用Feeder类表示。由于三种动物吃的动物一样,Feeder类必须拥有三个喂动物的公共方法:

C#编程语言与面向对象—— 多态

过程如下:

static void Main(string[] args)
{
Monkey m
=new Monkey();
Pigeon p
=new Pigeon();
Lion l
=new Lion();

Feeder f
=new Feeder();

f.Name
="小李";


f.FeedMonkey();
//喂猴子
f.FeedPigeon(); //喂鸽子
f.FeedLion(); //喂狮子
}

如果领导有又把熊猫交给他管理,这是我们的程序不得不给Feeder类在增加一个方法:FeedPanda();

万一小李后来又不管猴子了,又要从Feeder类中删除FeedPigeon()方法。

所以这种编程方式很明显不合理的。

我们可以应用多态的方法解决。

首先因为它们都是动物,因此,可以建立一个Animal抽象基类。

C#编程语言与面向对象—— 多态

 

由于不同的动物吃不同的食物,所以在Animal类中定义一个抽象方法:eat();有子类负责实现。

abstract class Animal
{
public abstract void eat();
}

//狮子
class Lion:Animal
{
public override void eat()
{
Console.WriteLine(
"吃肉");
}
}

//猴子
class Money:Animal
{
public override void eat()
{
Console.WriteLine(
"吃香蕉");
}
}

//鸽子
class Pigeon:Animal
{
public override void eat()
{
Console.WriteLine(
"吃大米");
}
}

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

C#编程语言与面向对象—— 多态

Feeder类代码:

//饲养员
class Feeder
{
public String Name;
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.Name
="小李";

f.FeedAnimal(m);
//喂猴子
f.FeedAnimal(p);//喂鸽子
f.FeedAnimal(l);//喂狮子
}

我们修改一下Feeder类的定义,增加一个新方法FeedAnimals(),新方法远程的功能是喂养一群动物,接受的是Animal的数组:

class Feeder
{
//喂养一群动物
public voidFeedAnimals(Animal[] ans)
{
foreach(Animal an in ans)
{
an.eat();
}
}
}

过程如下:

static void Main(string args)
{
//动物数组
Animal[] ans={new Monkey(),new Pigeon(), new Lion()};
Feeder f
=new Feeder();
f.Name
="小李";
f.FeedAnimals(ans);
}

代码中数组ans的元素为Animal,因此,可以在其中存入任何一个Animal的子类。具有这种特性的数组成为"多态数组"。

编程中应用多态,可以将其简化为一下两句:

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

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

使用多态的好处:

当要修改程序并扩充系统时,需要修改的地方较少,对其他部分代码的影响较小。

 

C#编程语言与面向对象—— 多态