Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理

1. 重载包括:普通方法的重载和构造方法的重载 1

1.1. 横向重载”和“纵向重载”1

1.2. 方法签名通过  方法名称,参数数量,参数类型+返回类型 参数顺序(命名参数)来组成1

1.3. 重载(重新载选方法流程,如下图所示2

2. 重载的实现方法::argus参数 vs  默认值。可选参数法 可选参数3

2.1. __call()函数是php类的默认魔法函数 3

2.2. Java通过反射调用方法重载 执行方法4

2.3. C++的重载4

3. 参考4

1. 重载包括:普通方法的重载和构造方法的重载

所谓重载,就是重复使用。而这个重复使用并不是反复使用同一个一模一样的东西,而是只是借用同一个名字而已。根据这个名字,根据不同的需求,提供不一样的功能。这就是重载。说一个例子,“父亲”这个词,其实是重载了的。如果你叫父亲,那是指你的父亲,而如果别人叫父亲,那是别人父亲。这也是一个重载。根据叫的人不同,也就是调用这个名称的对象不一样,产生的意义就不一样,这就是重载。所以,这里说的就是广义上的重载的概念。

1.1. 横向重载”和“纵向重载”

清楚了重载的本质分析,再来看看,“横向重载”和“纵向重载”的概念。函数特征标形式是在一个类中实现的多个函数版本,相当于在一个类中平铺多种形式,因此可以理解成横向(平铺)方式。而虚函数形式,是通过继承,构成一个垂直的关系。比如父亲跟儿子,属于两代人,是一个垂直的传递关系,父亲在上一层,儿子在下一层。也就是一个纵向的走向。C++中支持了虚拟函数,提供了重载虚函数的功能,因此就是我们说的“纵向重载”。

1.2. 方法签名通过  方法名称,参数数量,参数类型+返回类型 参数顺序(命名参数)来组成

1.3. 重载(重新载选方法流程,如下图所示

首先得到方法名称,查找符号表,没有跑出ex

通过参数数量判断

通过参数类型判断(强类型语言)

If(nomather())  ex

If(matchCount>1) ex cant select  amigo

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://www.cnblogs.com/attilax/

2. 重载的实现方法::argus参数 vs  默认值。可选参数法 可选参数

Php通过func_num_args();js通过argus参数

Python通过默认值

一个语言选择重载或者可选参数两者中的一种就是了。像C# 4这样同时支持这两种形式的,就比较容易混淆。

著作权归作者所有。

Python的parameter设定也足以应付绝大多数需求了,所以社区基于效率与语言复杂度的考虑,干脆就不支持function overloading了

2.1. __call()函数是php类的默认魔法函数

,__call() 在一个对象的上下文中,如果调用的方法不存在的时候,它将被触发:
<?php
class MethodTest {
     public function __call($name, $arguments) {
        // Note: value of $name is case sensitive.
        echo "Calling object method '$name' "
             . implode(', ', $arguments). "\n";
     }
}

2.2. Java通过反射调用方法重载 执行方法

paip.编程语言方法重载实现的原理及python,php,js中实现方法重载 - attilax的专栏 - 博客频道 - CSDN.NET.htm

2.3. C++的重载

C语言中函数符号名和对应的函数名是一样的,而C++为了支持函数重载,符号名是在对应的函数名上改编的。如下图所示,函数名为func,而对应的符号名为_Z4funcv。

实际上函数的编译符号是根据函数名,函数的参数表(包括参数类型和数量)相关的。而且不同的编译器的命名规则不一样。只要能保证相同的函数名和不同的函数参数列表生成的符号名不一样就行

3. 参考

PHP-PHP重载和多态的实现? - 德问 编程社交问答.htm

java怎样实现重载一个方法 - 郑树恒的个人空间 - 开源中国社区.htm

C++重载:横向重载(静态重载)与纵向重载(动态重载)-C++语言-编程语言-C++技术网.htm

为什么 Python 不支持函数重载? - 编程语言 - 知乎.htm

Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理的更多相关文章

  1. C#中通过类来继承两个接口,父类实例化接口中的方法,子类继承父类,调用方法

    实现了父类继承接口,父类实例化接口的方法,子类继承父类,子类调用父类的方法直接使用 代码如下: using System; using System.Collections.Generic; usin ...

  2. C#通过反射获取类中的方法和参数个数,反射调用方法带参数

    using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(stri ...

  3. (1)构造方法和方法重载 (2)this关键字 (3)方法的传参和递归调用

    1.构造方法和方法重载如: Person p = new Person(); - 声明Person类型的引用p指向Person类型的对象 p.show(); - 调用名字为show()的成员方法 1. ...

  4. C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法

    C#构造方法(函数)   一.概括 1.通常创建一个对象的方法如图: 通过  Student tom = new Student(); 创建tom对象,这种创建实例的形式被称为构造方法. 简述:用来初 ...

  5. 卧槽,好强大的魔法,竟能让Python支持方法重载

    1. 你真的了解方法重载吗? 方法重载是面向对象中一个非常重要的概念,在类中包含了成员方法和构造方法.如果类中存在多个同名,且参数(个数和类型)不同的成员方法或构造方法,那么这些成员方法或构造方法就被 ...

  6. 疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写

    一.方法重载(Overload): Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异). 同 ...

  7. JavaScript基础12——js的方法重载

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. Java 方法覆盖和方法重载

    方法重载(overloaded),要求方法的名称相同,参数列表不相同. 方法覆盖(override),要求①方法名相同,②参数列表相同,③返回值相同 如果是方法覆盖,要注意以下几种情况: 1.子类方法 ...

  9. [置顶] 在js中如何实现方法重载?以及函数的参数问题

    都知道在js中没有办法直接实现方法重载,因为在js中如果定义了多个名称相同,但参数个数不一样的方法,其实只有最后一个方法能被真正调用,其他的方法都被覆盖掉了. 但每一个函数都有一个特殊的参数argum ...

随机推荐

  1. 30、Django实战第30天:修改邮箱和用户信息

    修改个人邮箱需要完成两个接口,一个是获取验证码,一个是新的邮箱和验证码是否匹配 1.编辑users.views.py class SendEmailCodeView(LoginRequiredMixi ...

  2. 23、Django实战第23天:视频播放页面

    打开素材course-play.html,会发现播放页面处了包含播放器,其他和“章节”页面一样. 1.把course-play.html复制到template目录下 2.把下面两段代码拷贝出来 < ...

  3. Reference resources

    CentOS7 (精简操作指令) http://www.centoscn.com/CentOS/help/2016/0429/7147.html

  4. 【块状树】【树链剖分】bzoj1036 [ZJOI2008]树的统计Count

    很早之前用树链剖分写过,但是代码太长太难写,省选现场就写错了. #include<cstdio> #include<algorithm> #include<cstring ...

  5. TZOJ 数据结构实验:创建单链表

    描述 实现一个函数CreateLinkList,能够完成不带头节点链表的创建. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. void PrintLinkList(Node *head ...

  6. Swift开发经验——外部参数名

    一.什么是外部参数名? 浅显地说,外部参数名就是在调用一个方法时要在方法的参数前面加上一个特定的名字,目的是便于阅读代码,提高维护效率.   二.在最新的Xcode中,外部参数名的性质与用法如下 性质 ...

  7. ActiveMQ实战-集群

    原文:http://blog.csdn.net/lifetragedy/article/details/51869032 ActiveMQ的集群 内嵌代理所引发的问题: 消息过载 管理混乱 如何解决这 ...

  8. Scut游戏服务器免费开源框架--快速开发(3)

    Scut快速开发(3) 1     开发环境 Scut Lib版本:5.2.3.2 需要安装的软件 a)        IIS和消息队列(MSMQ) b)        数据库,Sql2005以上版本 ...

  9. linux下GPRS模块ppp拨号上网

    ---------------------------------------------------------------------------------------------------- ...

  10. 【Docker】MySQL容器因为内存限制启动失败?

    参考资料: https://github.com/docker-library/mysql/issues/3 Improving MySQL's default configuration:http: ...