- 浏览: 83812 次
- 性别:
最近访客 更多访客>>
最新评论
-
Bernice_liu:
谢谢分享,受益匪浅,适合我——初学者
Ruby语言中文教程all in one -
何枫abc:
怎么感觉Ruby有点像C!!!
3.5 标识名和变量的作用域 3.6 类库 3.7 数据类型 -
何枫abc:
谢谢了!!!你写的很好,现在我正在学Ruby!!!
第二章 运行环境 -
yangzhihuan:
正想知道ruby是怎么样生成像javadoc那样的文档,多谢了 ...
3.1 注释与分行 -
whisper:
从lambda演算的角度说我们并不关心一个东西到底是什么,而只 ...
变量一定要有类型吗(一)
在Java 中,重载(overload)和重写(override)是用来表现多态性的两种重要方式。override 也有译作“覆盖”、“覆写”。Java 中称作“覆写”比较恰当。
重载方法是指一个类中,方法名相同、参数列表不同的几个方法,调用时根据不同的参数调用不同的方法。方法重载与返回类型无关。
覆写方法是指子类有一个方法,方法名、参数列表、返回类型与父类的某个方法完全一致。调用时会调用子类的方法,而屏蔽掉父类的同名方法。需要注意的是,子类覆写的方法,其可访问性一定要强于或等同于,父类被覆写的同名方法。
覆写发生在子类和父类之间,当然也可以是子类和父类的父类之间。重载不仅仅是发生在子类和父类之间,大多数时候,发生在同一个类中。
4.5节说到:“ Ruby语言,只有重写,没有其它语言具有的严格意义上的重载。” 下面仔细分析 Ruby 为何没有重载,只有重写。
Java 的重载, 参数列表不同有三种形式。
一.参数个数不同
sum(int a)
sum(int a ,int b)
二.参数个数相同,参数类型不同
sum(int a)
sum(float a)
三.参数个数相同,参数类型相同,对应位置不同
sum(int a , float b)
sum(float a ,int b)
Ruby支持缺省参数,我们看程序 E6.1-1.rb :由于缺省参数和可变参数,参数个数不同而产生的重载,在Ruby中不再有效。Ruby语言中,定义方法时,不指定参数类型,因此第二种形式的重载也不存在。第三种形式的重载,实际是第二种形式的演化,所以,也就不存在了。综上所述,Ruby语言,没有方法的重载。
- def sum( a, b=5 )
- a+b
- end
- puts sum(3,6) # => 9
- puts sum(3) # => 8
调用sum(3,6) 与 调用sum(3) 在Java中是调用不同的方法,在Ruby中其实是在调用同一个方法。
Ruby还支持可变参数,我们看程序 E6.1-2.rb :
- # E6.1-2.rb
- def sum( *num )
- numSum = 0
- num.each { |i| numSum+=i }
- return numSum
- end
- puts sum() # => 0
- puts sum(3,6) # => 9
- puts sum(1,2,3,4,5,6,7,8,9) # => 45
方法的重写,我们在4.4节和4.5节已经看到了。Worker类与Student类继承自Person类,并且各自重写了Person类的talk方法。
这是在子类和父类之间,如果在同一个类中写两个同名方法呢?看程序 E6.1-3.rb :
- # E6.1-3.rb
- def talk (a)
- puts "This is talk version 1."
- end
- def talk (a,b=1)
- puts "This is talk version 2."
- end
- talk (2) # => This is talk version 2.
- talk (2,7) # => This is talk version 2.
总是写在后面的方法被执行。
从上面三个小程序可知:在Ruby中,我们说覆写是指重写,我们说重载也是指重写。
Java 和 C++ 是静态语言,程序代码运行中不可以再改变类的属性、方法,为了更好地表现面向对象的多态特征,所以用覆写和重载来加强程序的灵活性,在程序运行的时候,动态地选择要使用的方法, 完成后期绑定。而 Ruby 是动态语言,可以随时改变类的属性、方法,所以覆写和重载的重要性就降低了。仔细体会一下,一者是增大可选择性,一者是随时修改。
完整阅读,请看我写的 Ruby语言中文教程all in one
发表评论
-
8.4 迭代器、代码块、闭包
2007-02-13 06:25 1768先看一句代码: ruby 代码 (1..9). ... -
8.3 正则表达式
2007-02-13 06:13 1562一本入门小书,不想涉及正则表达式,但是正则表达式与Ruby语言 ... -
8.2 再说字符串
2007-02-13 06:07 1347一. 生成一个字符串 字 ... -
8.1 再说数组
2007-02-13 06:03 1476一. 建立一个数组 ruby 代码 #E8.1- ... -
7.4 require 和 load
2007-02-13 05:59 1359程序 E7.3-1.rb中先写了Me模块,然后include ... -
7.3 糅和(Mix-in) 与多重继承
2007-02-13 05:55 1807糅和,也译作混合插入,也许就称作 Mix-in 比较合适。 现 ... -
7.1 模块 7.2 命名空间
2007-02-13 05:50 22447.1 模块 我们常常把许 ... -
6.5 访问控制
2007-02-13 05:43 1180在Ruby里,要读取,或是改变对象的属性,唯一的途径是调用对象 ... -
6.4 单例方法
2007-02-13 05:16 1039同一份设计蓝图(类),不同的实例对象,可以表现出不同的行为特征 ... -
6.3 实例变量、类变量、类方法
2007-02-13 05:28 2273学习编程的过程,就是深化理解变量的过程。在面向对象编程中也不例 ... -
6.2 增强父类方法
2007-02-13 04:39 1036如果我们只是想增强父类的方法,而不是完全地替代它,就可以用关键 ... -
5.5 一些编码建议
2007-02-13 03:37 1147这里不是 Ruby语言的编 ... -
5.4 蓝图可以改变吗? ——动态语言
2007-02-13 03:28 776Ruby 是动态语言,你可以改变 Ruby 程序的结构,功能, ... -
5.3 详解变量—— 动态类型
2007-02-13 03:22 1186变量是什么?变量有哪些特征呢?学习编程的过程,就是深化理解变量 ... -
5.1 为什么是Ruby? 5.2 Ruby会长久么?
2007-02-13 03:16 10175.1 为什么是Ruby? 现 ... -
4.5 多态
2007-02-13 03:07 796不同的子类继承一个父 ... -
4.4 继承
2007-02-13 03:04 836如果我们要写一个学生 ... -
4.3 封装
2007-02-13 02:53 930让我们来定义一个类,类名是Person,类名首字母要大写;属性 ... -
4.1 两种思维方式 4.2 对象
2007-02-13 02:47 9334.1 两种思维方式 人们 ... -
3.11 一个综合小练习
2007-02-13 02:05 1025还是求50以内的素数,尽可能地用到本章更多的语法,看程序 E3 ...
相关推荐
1.6.5.4 虚方法、重写方法和抽象方法 17 1.6.5.5 方法重载 19 1.6.6 其他函数成员 20 1.6.6.1 构造函数 21 1.6.6.2 属性 21 1.6.6.3 索引器 22 1.6.6.4 事件 22 1.6.6.5 运算符 23 1.6.6.6 析构函数 23 1.7 结构 24 ...
C++是一种面向对象的...虚函数(virtual function)、运算符重载(Operator Overloading)、多重继承(Multiple Inheritance)、模板(Template)、异常(Exception)、RTTI、命名空间(Name Space)逐渐被加入标准。
C++是一种面向对象的...虚函数(virtual function)、运算符重载(Operator Overloading)、多重继承(Multiple Inheritance)、模板(Template)、异常(Exception)、RTTI、命名空间(Name Space)逐渐被加入标准。
- 虚函数允许子类重写父类的函数,从而实现多态性。 **1.7 类的书写规范** - 包括命名约定、注释风格等。 **1.8 小结** - 总结本章所学的关键概念和技术。 #### 二、Windows程序内部运行原理 **2.1 Windows...
**2.2 重载(Overloading)和重写(Overriding)的区别** - **重载(Overloading)**:发生在同一个类中,指多个方法可以有相同的名称,但它们的参数列表必须不同(包括参数类型、数量或顺序的不同)。重载与返回...
1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...
3.4 方法:方法的定义、调用,以及重载和重写概念。 四、数组与集合 4.1 数组:一维数组和多维数组的理解,以及数组的操作和遍历。 4.2 集合框架:ArrayList、LinkedList、HashSet、HashMap等常用集合类的使用,...
六、多态性6.1多态性是面向对象编程的关键特性之一,它允许不同的对象对同一消息作出不同的响应。6.2动态多态性通过虚函数实现,虚函数在基类中声明并在派生类中重写,使得调用相同函数名但实现不同的功能。6.3静态...
6.1 基本数据类型的包装类 167 6.2 处理对象 170 6.2.1 打印对象和toString方法 170 6.2.2 ==和equals比较运算符 172 6.3 类成员 175 6.3.1 理解类成员 175 6.3.2 单例(Singleton)类 176 6.4 final修饰符 ...
1.4.6重写 1.4.7逻辑 1.5其他方法 1.5.1Booch 1.5.2责任驱动的设计(RDD) 1.5.3对象建模技术(OMT) 1.6为向OOP转变而采取的策略 1.6.1逐步进入OOP 1.6.2管理障碍 1.7小结 第2章 数据抽象 2.1声明与定义 2.2一个...
1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...
1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...
1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...
#### 6.1 作用 - **引用父类对象**:`super` 关键字可以用来引用父类的对象。 - **调用父类构造方法**:使用 `super` 调用父类的构造方法。 - **调用父类方法**:使用 `super` 调用父类中的方法。 #### 6.2 示例 ...
**6.1 重写 equals() 方法时为什么必须同时重写 hashCode() 方法** 为了确保 Java 中的哈希表(如 `HashSet` 和 `HashMap`)能够正确地存储和检索对象,必须同时重写 `equals()` 和 `hashCode()` 方法。当两个对象...
1.4.6 重写 1.4.7 逻辑 1.5 其他方法 1.5.1 Booch 1.5.2 责任驱动的设计(RDD) 1.5.3 对象建模技术(OMT) 1.6 为向OOP转变而采取的策略 1.6.1 逐步进入OOP 1.6.2 管理障碍 1.7 小结 第2章 数据抽象 2.1...
#### 6.1 使用operator关键字 C#允许开发者重载大多数内置运算符,这使得自定义类型可以像内置类型一样使用标准运算符。通过使用operator关键字,可以在类中定义运算符的行为,从而提高代码的可读性和表现力。 ###...
1.4.6 重写 17 1.4.7 逻辑 17 1.5 其他方法 17 1.5.1 Booch 18 1.5.2 责任驱动的设计(RDD) 19 1.5.3 对象建模技术(OMT) 19 1.6 为向OOP转变而采取的策略 19 1.6.1 逐步进入OOP 19 1.6.2 管理障碍 20 1.7 小结 21...
6.1 为什么要用输入输出流 83 6.2 解决输入输出流问题 86 6.2.1 预先了解操作符重载 86 6.2.2 插入符与提取符 87 6.2.3 通常用法 88 6.2.4 面向行的输入 90 6.3 文件输入输出流 91 6.4 输入...