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

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

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

继承多态

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

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

饲养员用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. bzoj 3172: [Tjoi2013]单词

    #include<cstdio> #include<cstring> #include<iostream> #define M 1000008 using name ...

  2. Bootstrap <基础十二>下拉菜单(Dropdowns)

    Bootstrap 下拉菜单.下拉菜单是可切换的,是以列表格式显示链接的上下文菜单.这可以通过与 下拉菜单(Dropdown) JavaScript 插件 的互动来实现. 如需使用下列菜单,只需要在 ...

  3. HDU 4067 hdoj 4067 Random Maze 最小费用流

    给出n个点,m条边,入口s和出口t,对于每条边有两个值a,b,如果保留这条边需要花费:否则,移除这条边需要花费b. 题目要求用最小费用构造一个有向图满足以下条件: 1.只有一个入口和出口 2.所有路都 ...

  4. AWS-CDH5.5安装 CM配置节点

    在CM节点上进行安装时出现错误: ================================================================================ Pa ...

  5. WPF学习笔记1---初接触

    刚刚接触WPF,微软的一套东西.WPF最大的特点就是UI设计与代码逻辑的完全剥离.这样美工和程序员的分工就变得非常清楚.因为界面和程序的耦合度很低,也增加的代码的灵活性和可重用性. 微软为WPF的UI ...

  6. local认证

    文件路径 用途 示例 备注 #gedit /usr/local/etc/raddb/sites-available/default #gedit /usr/local/etc/raddb/sites- ...

  7. [make]makefile使用积累

    [注]:文中所指手册皆为GNU make Version 4.1 1.make的一般特性 1.1.Makefiles的构成 Makefiles包含五种元素: 显式规则(explicit rules), ...

  8. firefox,跨域ajax 调用方法

    在A站点ajax 调用B站的页面(方法)时, 使用post,且dataType类型为jsonp 有时在IE会有No Transport的错误提示,请加 jQuery.support.cors = tr ...

  9. Linux 终端常用快捷键

    Tab 自动补全 Ctrl+L 清屏 Ctrl+A 移动到头 Ctrl+E 移动到尾 Ctrl+左键头 左移一个单词 Ctrl+右箭头 右移一个单词 Ctrl+U 删除左边所有字符 Ctrl+K 删除 ...

  10. aspx在页面跳转(Response.Redirect)时丢失session问题及解决办法

    [问题描述] 假设a.aspx.cs页面保存有Session["empid"]="3",当a.aspx.cs通过Response.Redirect(" ...