摘自《扣响C#之门》
多态性的应用
1. 应用程序案例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AnimalDisplay
{
class Program
{
static void Main(string[] args)
{
//声明一个基类(Vertebrata 类)的引用符数组
Vertebrata[] animals = new Vertebrata[5];
//让每个引用符指向一个派生类对象
animals[0] = new Pig();
animals[1] = new Rabbit();
animals[2] = new Cattle();
animals[3] = new Frog();
animals[4] = new Duck();
//通用处理
foreach (Vertebrata someone in animals)
{
someone.Display(); //不论对象是什么类型,都使用相同的语句处理
}
}
}
//脊柱类
abstract class Vertebrata
{
public abstract void Display();
}
//哺乳类
class Mammal : Vertebrata
{
public override void Display()
{
}
}
//鸟类
class Bird : Vertebrata
{
public override void Display()
{
}
}
//两栖类
class Amphibian : Vertebrata
{
public override void Display()
{
}
}
class Pig : Mammal
{
public override void Display()
{
Console.WriteLine(@"
╭︿︿☆-╮ oοΟ
{/ . .\}
( (oo) )
︶︶︶
我是笨猪我怕谁 ");
}
}
class Rabbit : Mammal
{
public override void Display()
{
Console.WriteLine(@"
(\(\ /)/)
(-.-)(-.-)
小兔子乖乖");
}
}
class Cattle : Mammal
{
public override void Display()
{
Console.WriteLine(@"
(___)
(o o)____(
@@ ` \
\ ____, /
// //
^^ ^^
勤劳的牛");
}
}
class Frog : Amphibian
{
public override void Display()
{
Console.WriteLine(@"
@..@
(\--/)
(.>__<.)
^^^ ^^^
青蛙王子");
}
}
class Duck : Bird
{
public override void Display()
{
Console.WriteLine(@"
__
>(' )
)/
/(
/ `----/
\ ~=- /
~^~^~^~^~^~^~^
春江水暖鸭先知");
}
}
}
2. 多态的优点和应用
- 我们利用多态性实现了“通用编程”。
- 程序中的 foreach 语句是通用部分,Vertebrata 型引用符 someone 依次指向数组 animals 中的对象,不管对象是哪种动物,都使用语句“someone.Display()”进行绘图。
- 系统根据 someone 指向的动物类型调用对应版本的Display()方法。当添加一种新的动物时,只需要往数组里添加一个对象,程序的通用部分不需要修改。
- 继承和多态性是开发复杂软件的关键技术,特别适合于分层软件系统。
- 操作系统要处理各种各样的存储介质,比如硬盘、软盘、U 盘等等,这些硬件的具体工作原理显然是不同的,但它们都有读和写两个操作。操作系统可以设计一个抽象基类,提供 Read()和Write()两个抽象函数,各种硬件的驱动程序被编写为该抽象基类的派生类,具体实现 Read()和 Write()操作。操作系统只需通过基类的引用符调用 Read()和 Write()函数即可,不用关心在读取哪种存储介质,更不用关心它们是怎么实现的。当有新设备产生以后,设备生产厂家只需编写继承于抽象基类的驱动程序即可,不用更改操作系统本身。