面向对象---多态

  最新QQ弹窗弹了个腾讯课堂的推广消息,就点进去看了。里面琳琅满目,有着各种方面的免费基础教学。好奇心驱使,报名了一个.net的基础课堂,并加了群。群里很多都是在校学生和初学开发的朋友。看到他们和我初学时一样,对多态的理解很模糊,所以想写此博文。一来把自己的理解共享给大家,二来可以巩固自己所学,此为背景。

  让我们先来看看多态到底能够给我们带来什么好处。

  以一个飞机控制系统,需要让所有的飞机都可以飞起来。这是最容易想到的写法:

    /// <summary>
    /// 所有飞机的基类
    /// </summary>
    public class PlaneBase
    {
        public static PlaneBase GetPlane(string planeName)
        {
            switch(planeName)
            {
                case "喷气机":
                    return new Jet();
                case "直升机":
                    return new Copter();
            }
            return null;
        }
        /// <summary>
        /// 起飞
        /// </summary>
        public void Fly()
        {
            Console.WriteLine("起飞了!");
        }
    }

所有飞机的父类

    /// <summary>
    /// 喷气机
    /// </summary>
    public class Jet : PlaneBase
    {

    }

喷气机

    /// <summary>
    /// 直升机
    /// </summary>
    public class Copter : PlaneBase
    {

    }

直升机 

           static void Main(string[] args)
        {
            PlaneBase jet = PlaneBase.GetPlane("喷气机");
            jet.Fly();
            PlaneBase copter = PlaneBase.GetPlane("直升机");
            copter.Fly();
        }

控制飞机起飞

  我们利用了继承的特性,通过一个父类,让所有子类都自动具有了起飞的方法。

  但是我们很快发现了问题,直升机和喷气机的起飞方式不一样啊,喷气机是向前加速起飞的,直升机是直上的。

  于是我们修改我们的代码,在子类分别实现自己的起飞方法:

    /// <summary>
    /// 喷气机
    /// </summary>
    public class Jet : PlaneBase
    {
        public void Fly()
        {
            Console.WriteLine("喷气机起飞了!");
        }
    }

喷气机

    /// <summary>
    /// 直升机
    /// </summary>
    public class Copter : PlaneBase
    {
        public void Fly()
        {
            Console.WriteLine("直升机起飞了!");
        }
    }

直升机

        static void Main(string[] args)
        {
            Jet jet = new Jet();
            jet.Fly();  //喷气机起飞
            Copter copter = new Copter();
            copter.Fly();   //直升机起飞
        }

控制飞机起飞

  再次调试,哈,这次成功了,直升机和喷气机都按照自己的起飞方式起飞了。

  可是问题又来了,仔细对比两次控制飞机飞行的代码,发现区别了吗?

  我们控制的时候,不得不事先知道这是个什么样的飞机(具体的飞机对象),再去控制它起飞;这一定是控制者的恶梦。

  多态的强大之处就在此体现出来了,先来看看修改后的代码。

   /// <summary>
    /// 所有飞机的基类
    /// </summary>
    public class PlaneBase
    {
        public static PlaneBase GetPlane(string planeName)
        {
            switch(planeName)
            {
                case "喷气机":
                    return new Jet();
                case "直升机":
                    return new Copter();
            }
            return null;
        }
        /// <summary>
        /// 起飞
        /// </summary>
        public virtual void Fly()
        {
            Console.WriteLine("起飞了!");
        }
    }

所有飞机的父类

    /// <summary>
    /// 喷气机
    /// </summary>
    public class Jet : PlaneBase
    {
        public override void Fly()
        {
            Console.WriteLine("喷气机起飞了!");
        }
    }

喷气机

    /// <summary>
    /// 直升机
    /// </summary>
    public class Copter : PlaneBase
    {
        public override void Fly()
        {
            Console.WriteLine("直升机起飞了!");
        }
    }

直升机

        static void Main(string[] args)
        {
            PlaneBase jet = PlaneBase.GetPlane("喷气机");
            jet.Fly();
            PlaneBase copter = PlaneBase.GetPlane("直升机");
            copter.Fly();

            Console.ReadLine();
        }

控制飞机起飞

  我们在父类的Fly方法前加上了virtual关键字,将它标识为一个虚方法,然后在子类的Fly方法前加上了override关键字,意味着覆盖父类的方法(重写)。

  现在,我们的控制者只需要获取一个飞机(PlaneBase.GetPlane方法),并不需要关心获取到的到底是直升机还是喷气机,只要让它起飞(调用Fly方法),飞机就会按照自己的的起飞方式起飞了(程序自动调用对应子类的Fly方法)。

  就这样简单,但好处却是显而易见。

  如何实现多态?

  1. 存在一个继承体系结构。如果不存在继承体系结构,那么所谓的多态就无从谈起。

  2. 把我们需要的统一的接口(方法)在父类中定义,并标记为虚方法。

  3. 子类重写该方法。

  这只是多态最最基本的一种实现,也是用得最多的。

  那我们在什么时候需要用到多态呢?

  简单来说就是,当接口确定,而在不同环境中需要不同实现的时候,我们就要用到多态了。比如操作数据库的时候,我们只需要使用数据库父对象,调用一个统一的接口,就可以使用增删改查,不需要关心数据库到底是Sqlserver还是oracle,真正的数据库操作放到对应数据库的子类去实现;

  

  

  

时间: 2024-10-12 13:06:51

面向对象---多态的相关文章

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

多态编程的基本原理是: 使用基类或接口变量编程. 在多态编程中,基类一般都是抽象类,其中拥有一个或多个抽象方法,各个子类可以根据需要重写这些方法.或者使用接口,每个接口都规定了一个或多个抽象方法,实现接口的类根据需要实现这些方法. 因此,多态的实现分为两大基本类别:继承多态和接口多态. 继承多态 设想动物园饲养员每天需要给他所负责死样的狮子.猴子和鸽子喂食. 首先,建立三个类分别代表三个动物 饲养员用Feeder类表示.由于三种动物吃的动物一样,Feeder类必须拥有三个喂动物的公共方法: 过程

.Net学习 第3季 C#面向对象 多态

.Net 视频学习第2季 C#面向对象 面向对象 多态 概念:让一个(父类)对象表现出多种(子类)类型的特性:三种方法:虚方法/抽象类/接口 方法一:虚方法 将父类方法标记为虚方法,使用关键字virtual在返回值类型前,这个方法可以被子类重写一遍(在子类方法返回值类型前使用关键字override) 没有使用虚方法下: public class Person { private string _name; public string Name { get{return _name;} set{_

面向对象-多态的扩展实例

/** * 注意:以下语句为非可执行语句.不能运行 * Created by rabbit on 2014-07-29. * 需求 * 对数据库进行操作 * * 1.连接数据库 * 两种连接方式 * a.JDBC(java数据库连接) * b.Hibernate(框架连接) * * 2.操作数据库 * c create r read u update d delete * * 3.断开数据库 * * userinfoDAO * DAO data access object */ interfac

用面向对象多态的思想分别去求圆形和长方形的面积和周长

//用面向对象多态的思想分别去求圆形和长方形的面积和周长 static void Main(string[] args) { Sharp sharp = new Circle(5); double area=sharp.GetArea(); double perimeter= sharp.Getperimeter(); Console.WriteLine("面积是{0},周长是{1}",area,perimeter); Console.ReadKey(); } public abstr