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

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

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

继承多态

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

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

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

过程如下:

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抽象基类。

由于不同的动物吃不同的食物,所以在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:

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#编程语言与面向对象—— 多态的更多相关文章

  1. OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...

  2. OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态是基于继承的基础之上的,多态可以使得父类的指针指向子类的对象.如果函数或参数中使用的是父类类型,可以传入父类.子类对象,但是父类类型的变量不能直接调用子类特有的方 ...

  3. 李洪强iOS开发之OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...

  4. 【基础】Equal方法、面向对象-多态-继承-封装

    package Test; public class L3_1 { public static void main(String[] args) { C c1=new C(100); C c2=new ...

  5. Python之面向对象多态

    Python之面向对象多态 多态与多态性: 多态: 多态是指一类事物有多种形态,一个抽象类有多个子类,因而多态的概念依赖于继承. 1.序列类型有多种形态:字符串.列表.元组. 2.动物有多种形态:Pe ...

  6. Java面向对象多态

    Java面向对象多态 7.2对象 7.2.1创建对象 对象是类的实例 类的名称 对象名称 = new 类的名称(); 7.3继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域 ...

  7. C#面向对象-多态

    面向对象的三大特性(封装,继承,多态)大多少人都应该知道.前两个的话比较容易理解.本文主要说一下面向对象中的多态. 什么是多态?不同的对象对同一操作,产生不同的执行结果.这就是多态.那么多态又包含了: ...

  8. OC面向对象多态笔记

    面向对象的多态是建立在继承上,可以说没有继承就没有多态: 多态:父类指针指向了子类的对象: int main() { //假设已定义了Animal类和它的子类Dog,那么多态的代码体现就是 Anima ...

  9. JAVA面向对象-多态的理解

    面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...

随机推荐

  1. window下关闭nginx

    nginx -s stop taskkill /F /IM nginx.exe > nul

  2. 【 2013 Multi-University Training Contest 7 】

    HDU 4666 Hyperspace 曼哈顿距离:|x1-x2|+|y1-y2|. 最远曼哈顿距离,枚举x1与x2的关系以及y1与y2的关系,取最大值就是答案. #include<cstdio ...

  3. js归并排序法

    function mergeSort(arr) { var len = arr.length; if(len > 1) { var index = Math.floor(len / 2); le ...

  4. android 打包失败

    如果在打包时提示: proguard returned with error code 1   并且在控制台中输出:'java'不是内部或外部程序或批处理文件 那么就说明你的环境变量出问题了,之前用的 ...

  5. RabbitMQ Step by step(一) 安装

    RabbitMQ是一个消息中间件,可以存储转发消息,个人感觉优越于MSMQ RabbitMQ官方网站(http://www.rabbitmq.com)可以获取到安装文件,建议大家详细浏览官方网站,官方 ...

  6. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

  7. 在CDH5.5.0上安装Kudu6.0

    1. 下载安装文件: a. CSD文件:KUDU-0.6.0.jar b. kudu parcel:KUDU-0.6.0-1.kudu0.6.0.p0.334-el6.parcel和manifest. ...

  8. java mysql 日期类型

    mysql(版本:5.1.50)的时间日期类型如下: datetime 8bytes xxxx-xx-xx xx:xx:xx 1000-01-01 00:00:00到9999-12-31 23:59: ...

  9. C++ 11 lambda

    转载:http://www.cnblogs.com/kedebug/p/3224561.html lambda 表达式的简单语法如下:[capture] (parameters) -> retu ...

  10. window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法

    window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法 本机已经安装了jdk1.7,而比较早期的项目需要依赖jdk1.6,于是同时在本机安装了jdk1.6和jdk1.7. 安装 ...