`
yelr_j
  • 浏览: 68192 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

什么是多态 -- 转

阅读更多

也说面试的火爆是让我震惊的。既然标榜为一个有使命感的程序员,我觉得有责任再写一篇关于多态的文字。我无意再次挑起非技术的争议。所以关于也说面试的回复并不包含在本文中。本文是一篇纯技术文字,里面有任何谬误请不吝指出。我思考再三题目中保留了“再说面试”四个字,让整个事情有始有终,因为我说过要写一篇这样的文章。但是阅读的时候请抛开面试这个背景。

我的文章大多枯燥无味我推荐你阅读Allen Lee或者idior的文章,或者Google更多的文章(使用多态或者Polymorphism作为关键字)。

一、什么是多态?

多态是OO中最关键的特性之一(GOF语)。GOF给的定义是:The ability to substitute objects of matching interface for one another at runtime。即,在运行时刻接口匹配的对象能互换的能力。在Wikipedia上则表述为...,polymorphism lets you treat derived class members just like there parent class's members。即,多态使得你可以向对待父类的成员那样对待派生类的成员。不够直观?In practical terms, polymorphism means that if class B inherits from class A, it doesn't have to inherit everything about class A; it can do some of the things that class A does differently。即,如果class B继承自class A,它不必从class A中继承所有的东西;对于某些方法,class B可以采用与class A不同的做法和实现。

在Java和C#的语言机制中,多态表现为后绑定(或者叫动态绑定、晚期绑定),有两种形式:继承父类并重载父类中具有相同签名的方法(即overriding或者overwriting);实现抽象父类(或接口)中具有相同签名的方法。当你对由父类声明的对象调用该方法时,对应的子类中的方法就会被调用。顺便说一句overloading通常不被认为是多态机制。

在OO思想中多态隐藏具体实现,使得客户端在不了解具体实现而只了解其接口的情况下可以访问对象的方法,这使得抽象成为可能。

二、多态和抽象的关系

还是采用Wikipedia的说法吧:abstraction is a mechanism and practice to reduce and factor out details so that one can focus on a few concepts at a time。即,抽象是一种可以使你一次只关注一个事物几个概念的机制和实践。我觉得还是从反面去解释更为简单,抽象就是不具体,就可以抛开你所不关心的细节。

抽象可以使我们对对象进行更好的分类。想象一下,没有抽象,当你面对一个电灯泡的时候会多么的无奈:

  • 它有重量,这一点和石头很相似;
  • 它有体积,这一点和石头也很相似;
  • 它能发光,这一点和太阳很相似;
  • 它耗电,这一点和风扇很相似;
  • 它可以开关,这一点和门很相似。
  • ......

这一切特性都属于灯泡,所以灯泡不是石头、不是太阳、不是风扇也不是门。没有抽象,当你要打算为电灯泡写一个开关的时候,它也只能处理电灯泡对象,因为这个世界上(系统中)没有另一个东西具有电灯泡的所有特性。

有了抽象,世界将会怎样?

  • 你说电灯泡是一个有重量的对象所以它是个Weighable(可称重的),那个用来给石头称重的系统也适用于电灯泡!
  • 你说电灯泡是一个有体积的对象所以它是个Stereometriable(可以求积的),那个用来给石头算体积的系统居然也适用!
  • 你说电灯泡是一个可以开关的对象所以它是个个Switchable(可开关的),那个用来开关门的系统也可以开关电灯泡吧!
    ......现在我们可以为电灯泡的各种特性分类了,从不同的角度看待电灯泡。

这个时候你就发现你的系统对于电灯泡的依赖越来越低了,哪一天电灯泡不发光了(还叫电灯泡:)),你的开关函数居然还是不用重写呢。抽象相对于具体类要稳定,所以依赖于抽象也比依赖于具体类要稳定。

并不是说没有多态就做不到抽象,只是没有多态抽象就很难做得如此优雅。语言机制中的多态为抽象处理了大部分你不希望关心的细节。

三、多态与耦合的关系

耦合的定义:The degree to which software components depend on each other。即软件构件之间相互依赖的程度。当系统耦合越强的时候,系统越僵化、越不容易维护、不容易重用,更糟糕的是耦合越强的系统越不稳定。理论上系统中所有的构件之间都是耦合的,只是耦合的程度不同,所以我们追求解耦合实际上是追求松耦合。这篇文章称松耦合是软件的终极目标,虽然有些过激但是是非常有道理的。

解耦合的方法通常包括抽象耦合和增加层。抽象耦合:既然必须依赖,依赖于抽象总比依赖于具体要松一些(比如Observer模式)。增加层的方法有很多,在OO的机制内可以以委托的方式将部分职能转移到专门的类中(比如将创建职能转移到工厂中),而这个专门的类是一个相对稳定的类;也可以加入一个层隔离与不希望关心的构件的关系(比如Facade模式)。

 

分享到:
评论

相关推荐

    【IT十八掌徐培成】Java基础第06天-03.多态-类多态-接口多态-同名属性问题.zip

    在Java中,多态分为类多态和接口多态。类多态主要体现在子类对象可以被当作父类对象来使用,这是因为子类继承了父类的特性,同时也可能扩展了自己的特性。例如,动物是父类,狗和猫是子类,那么我们可以说一个动物...

    Java-多态--学习笔记.docx

    1. **多态应用**:多态性允许我们使用一个类型的引用指向它的子类型实例,这样在调用相同的方法时,会根据实际的对象类型执行不同的操作。这种现象在程序设计中非常常见,例如在处理不同类型的动物时,虽然都具有...

    从虚拟机角度看Java多态->(重写override)的实现原理

    Java多态是面向对象编程中的一个核心特性,它允许我们以一种统一的方式处理不同类型的对象。在Java中,多态性主要通过继承、接口和方法重写(Override)来实现。这里我们将深入探讨从虚拟机(JVM)的角度来看,Java...

    多态学习-什么是多态及代码

    《深入理解Java多态》 在Java编程语言中,多态(Polymorphism)是面向对象编程的三大特性之一,另外两个是封装和继承。多态性是指一个接口或者类可以表现出多种形态,使得程序在运行时能够根据实际的对象类型执行...

    Java 多态中的类型转换

    本篇将深入探讨Java多态中的类型转换,包括向上转型(Upcasting)和向下转型(Downcasting),以及相关的注意事项。 1. **向上转型(Upcasting)** 向上转型是指将子类的对象引用赋值给父类的引用。在Java中,这是...

    11-面向对象-第3天(接口多态)-讲义共6页.pdf.z

    多态有两种主要形式:静态多态(编译时多态)和动态多态(运行时多态)。静态多态主要通过方法重载和运算符重载实现,即在编译期间确定调用哪个方法。而动态多态依赖于继承和虚函数(或抽象方法),使得子类可以重写...

    10-JAVA-多态

    JAVA多态思维导图,便捷整理思路,多态的好处、多态的语法格式、多态中的两种类型转换:向上转型、向下转型

    Lesson06--OOP多态.pdf

    ### Lesson06--OOP多态.pdf 知识点总结 #### 多态概念与基础知识 **多态**是面向对象编程(OOP)中的一个核心概念,它允许子类对象替代父类对象,从而使同一接口能表现出多种行为。本章节主要介绍了多态的基本原理...

    多态的练习案例

    在编程领域,多态(Polymorphism)是面向对象编程中的一个重要概念,它允许我们用一个接口处理多种不同的数据类型。多态性使得程序更加灵活,可扩展性更强,能够提高代码的重用率。本练习案例将深入探讨多态的常见...

    教学视频-继承&多态

    在编程领域,继承和多态是面向对象编程(OOP)中的两个核心概念,尤其是在Java这样的面向对象语言中。这两个概念极大地增强了代码的重用性和灵活性,使得软件设计更加高效和模块化。以下是对这两个概念的详细解释: ...

    JAVA 多态操作----父类与子类转换问题实例分析

    JAVA 多态操作----父类与子类转换问题实例分析 JAVA 多态操作中的父类与子类转换问题是 Java 编程语言中的一种重要概念。多态操作允许我们在编程中使用父类类型的引用来指向子类类型的对象,这种机制使得我们可以...

    JAVA面向对象基础测试题-继承-封装-多态等测试题.docx

    3. **多态**:多态是指允许不同类的对象对同一消息作出响应,即同一操作作用于不同的对象,可以有不同的解释,会产生不同的执行结果。多态性提高了软件的可扩展性和可维护性。 ### 具体题目解析 #### 题目1:局部...

    java多态小结

    #### 什么是多态? 多态(Polymorphism)是面向对象编程的一个核心特性,指的是一个接口可以被多个类所实现或一个类可以被多个类所继承,进而表现出不同的行为。在Java中,多态主要体现在两个方面:**编译时类型与...

    java多态的总结

    在Java中,多态分为编译时多态和运行时多态。编译时多态主要体现在方法的重载(Overloading),即在同一个类中可以有多个同名方法,但参数列表不同。编译器会根据传入参数的类型和数量来决定调用哪个方法。运行时...

    Java 多态应用,掌握多态

    多态分为编译时多态和运行时多态。编译时多态主要通过方法的重载(Overloading)实现,即在同一个类中定义多个同名但参数列表不同的方法。而运行时多态则是通过方法的重写(Overriding)和接口实现实现,它依赖于...

    一个实例告诉你什么是封装继承和多态

    封装、继承和多态是面向对象编程的三大特性,它们是Java、C#、Python等许多编程语言中的核心概念。本文将通过一个实例详细解析这三个概念,并以`ConsoleApplication1`为例来阐述。 首先,封装是面向对象编程的基础...

    java 多态 经典讲解

    ### Java多态经典讲解 #### 一、理解Java多态 多态,作为面向对象编程的三大特性之一,是继抽象和继承之后的关键概念。它允许我们以统一的接口处理不同类型的对象,增强了代码的灵活性和可扩展性。在Java中,多态...

    java编程第八讲----多态

    第八讲 多态 1、再谈向上类型转换(upcasting) 忘记对象的类型 2、多态机理 方法绑定(method binding) 产生正确的行为 可扩展性 陷阱:置换私有方法 3、抽象类与抽象方法 4、构造方法与多态 ...

    java中对象转型多态抽象类接口笔记.doc

    ### Java中的对象转型与多态 #### 一、对象转型 在Java中,对象转型(Casting)是指将一个对象的引用从一个类转换到另一个类的过程。这通常发生在类的继承关系中。 ##### 向上转型(Upcasting) - **定义**:将...

    Java多态的实现机制

    Java多态的实现机制 Java 多态的实现机制是面向对象程序设计中代码重用的一个重要机制。多态性是 Java 的三大属性之一,在开发中很重要的一个环节。多态性使对象能够调用正确的方法版本,从而提高代码的重用性和...

Global site tag (gtag.js) - Google Analytics