• 多态(Polymorphism)


    多态(Polymorphism)
    -- 面向对象的典征,现代软件设计的基石

    All rights reserved.
    Samuel
    12.12.2004 first published on
    www.cnblogs.com/samuel

    前言

       如果让你选择一项面向对(Object Oriented,后文简称OO)象最重要的或者最能表现OO特点的技术特征,会是什么?


       封装(wrap)、继承(inheritance)、重载(override)还是多态(polymorphism),亦或是其他?
    在我看来,答案无疑将是多态。封装是优点,继承是基础,重载是特点,而多态则是特征。


      虽然这四者缺一不可,无论少了哪一个,就像一个人缺胳膊少腿,使OO将不再是完整的,但是前三者对于OO来说好比鼻子耳朵,而多态则是生殖器,没有多态的
    OO就象是被阉割的雄性,已经失去其典征。

     

    什么是多态?

      简单来说,多态是具有表现多种形态的能力的特征,在OO中是指,语言具有根据对象的类型以不同方式处理之,特别是重载方法和继承类这种形式,的能力。多态被认为是面向对象语言的必备特性。

    多态有多种分类,通过了解这些分类可以更丰满对其认识,在这里就不再罗列,请各位参考 wiki大百科 javaworld .

     


    多态与泛型(generic)

      多态实际上就是泛型。


       所谓泛型就是指我们不为特定的类型进行专门编码,而采用对不同类型进行通用编码的方式,无论是数据结果还是算法。


      传统的泛型是指类似以Template function的方式使参数一般化,典型的应用是C++ STL,比如List、Vector以及algorithm。


      而OO已能通过接口(Interface)和抽象类(Abstract Class)进行真正意义上的泛型了。在我看来,这就是OO最精彩的地方,也就是多态的威力。而对于传统意义上的Generic,我始终觉得其作用已经今不如昔了。

     

    多态和继承(Inheritance)

      严格来说,多态与继承、重载并不是孤立的,他们之间存在着紧密的联系,多态是建立在这两者的基础之上的(实际上继承就有用重载这一特性)。


      传统的多态实际上就是由虚函数(Virtual Function)利用虚表(Virtual Table)实现的(早期C模拟OO特性时使用最多,C++的实现也是,后来的技术未作研究,是
    否使用VT不得而知),自然是离不开继承,换句话说多态实际上覆盖了继承。

      正是由于继承与多态的紧密联系,使得我们很容易张冠李戴,那么如何区别呢?

      举个常用的例子:

    Abstract Class Sharp implement IHaveSide {
     public bool isSharp(){
       return true;
     }
     public abstract int getSides();
    }

    Class Triangle extends Sharp {
     public override int getSides() {
       return 3;
     }
    }

    Class Rectangle extends Sharp {
     pubilc override int getSides() {
      return 4;
     }
    }

    那么这种类的关系叫做继承,下面这种使用方式也是继承所带来的:
    Triangel tri = new Triangle();
    println("Triangle is a type of sharp? " + tri.isSharp());

    而这种方式则是多态:
    Sharp sharp = new Rectangle();
    println("My sharp has " + sharp.getSides() + " sides.");

    这两者区别在哪?很显然,继承是子类使用父类的方法,而多态则是父类使用子类的方法。

    其技术上的区别是绑定时期,晚期绑定一定是多态。

    这里介绍区别并不是想说茴字有几种写法,而是只有清楚的认识到技术的显著特点后才能更好的使用它。

     

    现代软件设计

      现代软件大量的使用框架、模式(非特指Deisgn Pattern),也就是将软件开发的一些共性进行抽象,提出普遍适用的软件结构。


      无论是框架还是模式,他们都有一些明显的共同点 — 使用xml配置对象,大量使用接口采用所谓面向接口的方法,利用反射实现。

      为什么要接口?因为需要抽象,需要将未知的对象在已有的框架中表现。


      如何实现接口?多态!所谓反射,实际上就是一种晚期绑定的技术,这个技术实质上表现出来的就是多态这一特征。

      面向方面开发(Aspect Oriented Programming)是一个热点,也是现代软件发展的趋势。定制、组件装配的软件开发方式在应用越来越复杂、需求变化越来越快的今天显得日趋重要。那么如何才能使今天的软件能够适应明天需要呢?如何使我开发速度更快?如何能更容易的修改应用?AOP则是解决这些问题的有效手段。


      让我们看看框架容器的主要模式,Inversion of Control Containers(IoC)/Dependency Injection(包括setter injection, construct injection, interface
    injection等),其主要好处就是类之间的依赖,通过运行期的查找来进行绑定。那么他的基础是什么呢?还是多态!


      我们可以看到,在现代软件的开发中,无数的思想象火花一样跳动。其中一类很重要的思想就是建立在多态这样一个很基本的特性,甚至可以说是一个语言概念之上的。在这里希望通过这篇文章抛砖引玉,引起更多的对与当今软件发展发向的思考,同时探究其根源。

     

    后记

    行文简陋,错漏在所难免,愿与诸位探讨

     

    参考
    wiki大百科  
    http://en.wikipedia.org/wiki/Polymorphism_(computer_science)
    java世界    
    http://www.javaworld.com/javaworld/javatips/jw-javatip30.html
    Matin Fowler http://www.martinfowler.com/

  • 相关阅读:
    Magento速度优化
    magento-connect-manage出现404或者500内部错误的解决办法
    magento -- 给后台分类管理页的分类商品加一栏商品类型
    magento -- 添加新产品时状态默认为激活,库存状态默认为有库存
    magento -- 如何为商品分类(category)添加自定义属性
    magento -- 如何改善前台图片质量
    安装Let's Encrypt SSL证书
    centos版本查看
    ps
    设置桥接虚拟网卡
  • 原文地址:https://www.cnblogs.com/Samuel/p/Polymorphism.html
Copyright © 2020-2023  润新知