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

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

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

继承多态

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

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

饲养员用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. js判断鼠标向上滚动并浮动导航

    <div id="Jnav"> <ul class="nav"> <li><a href="#"& ...

  2. 【浅层优化实战】ssh远程登录Linux卡慢的全过程排查及解决方案

    ssh远程登录Linux卡慢的全过程排查及解决方案 前言: 在linux操作系统使用过程中偶然一次感到使用ssh远程连接软件连接操作系统需要等待许久,第一次没在意,第二次也没在意,第三次有点忍受不住了 ...

  3. Oracle查询表空间使用情况

    --查询表空间使用情况 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", ...

  4. 节点操作js jQuery

    append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() - 在被选元素之前插入内容 functi ...

  5. Service Broker应用(2):不同server间的数据传输,包含集群

    不同Server之间的数据传输,包含DB使用AlwaysOn 配置脚本: SQL Server Service Broker 跨集群通信 具体的TSQL 脚本语句如下.注意的是TSQL语句是在发送方还 ...

  6. C++虚函数和虚函数表

    前导 在上面的博文中描述了基类中存在虚函数时,基类和派生类中虚函数表的结构. 在派生类也定义了虚函数时,函数表又是怎样的结构呢? 先看下面的示例代码: #include <iostream> ...

  7. 使用Object类型的多态引用是会付出代价的

    import java.util.*; public class FiveShi { String name; public void eat(){ System.out.println(" ...

  8. Java和eclipse常用操作

    eclipse: ctrl+F10 显示行号 ctrl+shift+F 自动对齐 ctrl+/ 注释 java: jar包: Manifest-Version - 指定清单文件的版本号 Main-Cl ...

  9. yii2从零开始一,安装

    1.官网下载软件包 这里选择普通包,也可以是增强包 2.运行basic目录下 requirements.php ,查看环境是否符合要求,yii2要求php5.4以上 3.运行 basic/web下in ...

  10. compare

    icompareble 默认的比较器 list.sort() compareto icompare Keyvaluepair<k,p>Where k:new()