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

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

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

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

继承多态

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

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

饲养员用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#编程语言与面向对象—— 多态

时间: 2024-10-11 00:14:44

C#编程语言与面向对象—— 多态的相关文章

C#编程语言与面向对象——核心

面向对象的核心 (1).封装 封装的类=数据+对此数据所进行的操作(即算法) 封装起外界不必需要知道的东西,指向外界展现可供展示的东西. 小到一个简单的数据结构,大到一个完整的软件子系统.静态的如某软件系统要收集数据信息项,动态的如某个工作处理流程,都可以封装到一个类中. 具备这种意识,是掌握面向对象分析与设计技巧的关键. (2).抽象 在使用面向对象的方法设计一个软件系统时,首先就要区分出现实世界中的事务所属的类型,分析它们拥有哪些性质与功能,再将他们抽象为在计算机虚拟世界中才有意义的实体——

09.面向对象多态的概述及其代码体现

09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic [,p?l?'m??f?k])概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案例演示 代码体现多态 案例: class Demo1_Polymorphic { public static void main(String[] args) { Cat c = new Cat();//猫是一只猫 c.eat(); Animal a = new Cat

转:OC面向对象—多态

OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. Animal类的声明 Animal类的实现 Dog类继承自Animal类 Dog类的实现 测试程序: 二.使用注意 代码分析: Dog *d=[[Animal  alloc] init];   动物是一条狗?语义正确吗? NSString *str=[Dog  new];     狗是一个字符串?

OC面向对象-多态

OC面向对象-多态 一.基本概念 1>多态在代码中的体现,即为多种形态,没有继承就没有多态 2>在使用多态时,会进行动态检测,以调用真实的对象方法 3>多态在代码中的体现即父类指针指向子类对象 Animal类的声明 #import <Foundation/Foundation> //声明一个Animal类,该类继承自NSObject @interface Animal : NSObject //在Animal类中声明一个eat的对象方法 -(void) eat; @end A

面向对象多态之接口

申明下:我也是新手,以下如有不对或不合适的地方望指出,一起交流O(∩_∩)O哈! 好了,转入正题 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Interface 7 { 8 class InterfaceTest 9 { 10 static void Main(string[] args) 11 { 12 #region 测试

黑马程序猿-面向对象-多态

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>.<a href="http://edu.csdn.net"target="blank">.Net培训</a>.期待与您交流! ---------------------- 一多态的前提:(1)要有继承关系(或

黑马程序员-面向对象-多态

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>.<a href="http://edu.csdn.net"target="blank">.Net培训</a>.期待与您交流! ---------------------- 一多态的前提:(1)要有继承关系(或

C#编程语言与面向对象——委托

委托(delegate)也可以看成是一种数据类型,可以用于定义变量,但它是一种特殊的数据类型,所定义的变量能接收的数值只能是个函数,更确切地说,委托类型的变量可以接收一个函数的地址. 简单地说 委托变量可看成是一种类型安全的函数指针,他只能接收符合其要求的函数地址. 示例: public class MathOpt { public int Add(int argument1,int argment2) { return argument1+argment2; } } public delega

C#编程语言与面向对象——继承

现实生活中的事物都归属于一定的类别,比如,狮子是一种(IS_A)动物,为了在计算机中模拟这种关系,面向对象的语言引入了继承(inherit)特性. 构成继承关系的两个类中,Animal称为父类(parent class)或基类(base class),Lion称为子类(child class). 父类与子类之间拥有以下两个基本特性: 1.是一种(IS_A)关系:子类是父类的一种特例. 2.扩充(Extends)关系:子类拥有父类所没有的功能. class Animal { } class Lio