`

多态知多少

阅读更多
今天看书,看到了这一句:The ability to implement polymorphism through functional overloading is not supported by PHP and probably never will be.
作为从c++开始学习面向对象的程序员,第一反应就是这个是不是说错了,通过函数重载来实现多态?我当时也大大的sb了一把,以为是印错了,或者说错了。然后在网上搜了一下多态,在有些语言中函数重载(函数名相同,参数不同的)也被称为函数的多态,理由是函数名相同,但可以表现出多种行为,自然符合多态的含义。
又从wiki查了一下多态有两种类型ad-hoc polymorphism和parametric polymorphism。ad-hoc polymorphism通过子类化和方法覆写来实现的,也就是面向对象方面的概念,而parametric polymorphism就是c++中的泛型编程,根据传递的类型参数来表现出多态。
我感觉这ad-hoc polymorphism通过子类化和方法覆写来实现的这个其实说的并不准确,这是针对静态语言来说的,在动态语言中,多态不是靠类型和继承来是实现的:
静态语言和动态语言的多态:
在静态语言中的概念中类即类型,接口即亦即类型,类型在多态中起到了重要的作用,类型决定了对象的行为。
在动态语言中类不是类型,类型是由行为决定的,这就是所谓的Duck Type的概念,能像鸭子一样行走,像鸭子一样叫的,就被称为鸭子类型。动态语言,语言是弱类型的,编译器/解释器不会检参数传递的是不是那个类型,而只会在在实际使用的时候检查是否具有这个行为。所以在动态语言中多态不是由类型决定的。在动态语言中接口的概念通常是不需要的(php5具有接口这个概念,这是在动态语言中少有的),既然这样,接口其实不是一个面向对象所必须的概念。因为在动态语言中你不能够通过接口来达到契约的作用,不需要需要通过接口编程来达到可插拔的替换掉实现的目标(在静态的面向对象语言中一直倡导的面向接口编程,这个东东其实和“面向抽象而不是具体编程”还是不一样的,他只是在静态类型的面向对象的一种表现,而“面向抽象而不是具体编程”则是一个原则高度上的东西。)。既然多态不靠类型来实现,所以也不依赖继承来实现。
1
1
分享到:
评论

相关推荐

    平时作业继承派生多态的练习

    在VC6.0 或者VS2008、VS2010、vs2012、vs2013 下建立win32 control application 项目, 在完成下列项目。在其过程中学习类、对象的基本编程方法,同时巩固C 语言课程学习的基本编程知 识。

    基于多态的职工信息管理系统设计源码

    本项目是一个基于多态的职工信息管理系统设计源码,共包含37个文件,其中包括6个TLOG文件、6个OBJ文件等。系统采用了C/C++技术,为用户提供了一个便捷的职工信息管理解决方案。系统设计注重用户体验和响应速度,采用...

    混合存储必知四件事

    对于初学者和刚刚进入存储行业的菜鸟可以在里面学习到很多知识,值得一读,如果有资料需求可以喝本人联系

    小白 的 Java面试必知必会系列.rar

    多态:多态的本质就是一个程序中存在多个同名的不同方法,主要通过三种方式来实现: 通过子类对父类的重写来实现 通过在一个类中对方法的重载来实现 通过将子类对象作为父类对象使用来实现 关于封装 封装主要是为了...

    C# 温故而知新:stream篇

    2.4 从StreamReader想到多态 2.5 简单介绍下Encoding 编码 2.6 StreamReader 的定义及作用 2.7 StreamReader 类的常用方法属性 2.8 StreamReader示例 3.1 为何介绍TextWriter? 3.2 TextWriter的构造,常用属性和方法 ...

    Extreme Injector v3.6.1 - by master131_mpgh.net

    它由master131开发,据我所知,主要是mpqh成员。Extreme Injector实际上创建了许多现在期望用于注射器的“标准”功能。我要说的是,与GH Injector相比,它的一个好处是窗户小巧美观。无论如何,许多功能都是相同的。...

    java设计模式(设计实例从面向对象的设计中精选出23个设计模式)

    当我们提及“类型”和“多态”,或“接口”继承与“实现”继承的关系时,你应该对这些概念了然于胸,而不必迫不及待地翻阅手头的字典。 另外,这也不是一篇高级专题技术论文,而是一本关于设计模式的书,它描述了...

    鸡啄米:C++编程入门系列

    鸡啄米:C++编程入门系列之四十四(多态性:多态的概念和类型) 鸡啄米:C++编程入门系列之四十五(多态性:运算符重载的概念和规 则) 鸡啄米:C++编程入门系列之四十六(多态性:运算符重载为类的成员 函数)...

    深度探索 c++对象模型 中文版

    增加,虽然也用到了多态、重载等一些OO的设计方式,但最后这个类庞大无比,除了在当前系统中任劳任怨的工作外,一点复用的可能 都没有,如果另一个系统还需要一个类似的东西,那只能重新设计实现一个新的类。并且最...

    理解C++编程中的std::function函数封装

    先来看看下面这两行代码: std::function<void> ...如果你对上述两行代码表示毫无压力,那就不妨再看看本文,就当温故而知新吧。 std::function介绍 类模版std::function是一种通用、多态的函数封装。std::function的

    C# 4.0权威指南-姜晓东

    内容全面,不仅重点讲解了C# 4.0的所有新特性,而且对C#的所有[0知0]识点的原理、用[0法0]和要点都进行了全面的讲解和深度的分析,广度和深度完美结合。《C#4.0指南》注重实践,包含[0大0]量有价值的示例代码,可...

    C++必知必会【可搜索+可编辑/复制/粘贴+无密码】

    条款2 多态··········•• .. ···············........................................................................ 2 条款3 设计模式..雁........................................

    tagged-ts:带有标签的工会代码生成库,用于区分口味

    与多态类型构造函数一起使用据我所知,这是目前唯一的这种TypeScript代码生成库,完全支持使用泛型处理联合类型。 这意味着您可以为类似类型的类型生成构造函数,防护,模拟模式匹配的函数等。 type Maybe < A> = ...

    Python全栈开放实战教程

    第五章 面向对象编程设计及开发:这一章将介绍Python的面向对象编程,包括类和对象的概念,继承,多态,以及封装等内容。 第六章 网络编程-SOCKET并发:Python的网络编程,包括socket的使用,以及如何实现并发编程。...

    设计模式可复用面向对象软件的基础(中文版)

    当我们提及“类型”和“多态”,或“接口”继承与“实现”继承的关系时,你应该对这些概念了然于胸,而不必迫不及待地翻阅手头的字典。 另外,这也不是一篇高级专题技术论文,而是一本关于设计模式的书,它描述了...

    设计模式可复用面向对象软件的基础

    当我们提及“类型”和“多态”,或“接口”继承与“实现”继承的关系时,你应该对这些概念了然于胸,而不必迫不及待地翻阅手头的字典。 另外,这也不是一篇高级专题技术论文,而是一本关于设计模式的书,它描述了...

    leetcode下载-Interview-Notebook:面试记事本

    内容包括三大原则(继承、封装、多态)、类图、设计原则。 数据库 :floppy_disk: 参考 数据库系统原理。 参考 SQL 必知必会。 Leetcode 上数据库题目的解题记录。 参考 高性能 MySQL。 参考 Redis 设计与实现、Red

    leetcode下载-Notebook:招聘笔记

    内容包括三大原则(继承、封装、多态)、类图、设计原则。 数据库 :floppy_disk: 参考 数据库系统原理。 参考 SQL 必知必会。 Leetcode 上数据库题目的解题记录。 参考 高性能 MySQL。 参考 Redis 设计与实现、Red

    leetcode下载-book:书

    内容包括三大原则(继承、封装、多态)、类图、设计原则。 数据库 :floppy_disk: 参考 数据库系统原理。 参考 SQL 必知必会。 Leetcode 上数据库题目的解题记录。 参考 高性能 MySQL。 参考 Redis 设计与实现、Red

    leetcode下载-java_learnSource:java基础知识

    内容包括三大原则(继承、封装、多态)、类图、设计原则。 数据库 :floppy_disk: 参考 数据库系统原理。 参考 SQL 必知必会。 Leetcode 上数据库题目的解题记录。 参考 高性能 MySQL。 参考 Redis 设计与实现、Red

Global site tag (gtag.js) - Google Analytics