返回信息流感谢各位大神的解答,现在对多态的理解清晰多了~~~
——————————————————
最近看了下java的多态,网上资料也很多,主要都是讲:继承、重写、向上转型之类的东西,还有动态绑定,但是一直不理解多态的好处,看网上有说可替换性、可扩充性、接口性、灵活性、简化性,例子也挺多 什么猫叫、狗叫。
但是想,如果直接为每个类定义相应的方法不就行了么= = 多了个父类的方法,还被重写了。
现在唯一能想到的好处就是子类不重写父类的方法,这样能够提高代码重用性,但是这又不符合多态的定义了。。。求大神解答= = 最好能对多态的好处有能比较好理解或者直观的解释或者例子
多谢多谢~~
这是一条镜像帖。来源:北邮人论坛 / java / #41279同步于 2015/6/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
关于多态
Lamperouge
2015/6/3镜像同步24 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
下面的FileReader类也有read()方法,但它可以为盲人提供屏幕阅读服务吗?
class FileReader {
public FileReader(String fileName) { ... }
public void read() { /* read from file into internal buffer */ }
}
interface BlindHelper {
void read(); // Read text for the blind (generate sound and play)
}
class ScreenReader implements BlindHelper {
public ScreenReader(String text) { ... }
@Override
public void read() {
Sound snd = textToSpeech(text);
snd.play();
}
}
class Blind extends Person {
public void setBlindHelper(BlindHelper helper) {...}
}
public class Main {
public static void main(String[] args) {
Blind b = new Blind();
b.setBlindHelper(new FileReader("README.md")); // 这行可以吗?
}
}
不可以,因为没有实现接口
不过我比较疑惑的地方是:如果没有BlindHelper这个接口(setBlindHelper这个类的参数也相应地变成ScreenReader)也可以实现这个功能,那么有这个接口的话如果之后还有什么BigScreenReader或者TouchReader的话完全不用修改Blind类里面的setBlindHelper方法了,那么和直接在Blind里面定义这些Helper相比,都有哪些优势呢?
【 在 nuanyangyang 的大作中提到: 】
: 下面的FileReader类也有read()方法,但它可以为盲人提供屏幕阅读服务吗?
: [code=java]
: class FileReader {
: ...................
【 在 Lamperouge 的大作中提到: 】
: 不可以,因为没有实现接口
: 不过我比较疑惑的地方是:如果没有BlindHelper这个接口(setBlindHelper这个类的参数也相应地变成ScreenReader)也可以实现这个功能,那么有这个接口的话如果之后还有什么BigScreenReader或者TouchReader的话完全不用修改Blind类里面的setBlindHelper方法了,那么和直接在Blind里面定义这些Helper相比,都有哪些优势呢?
关键是这些实现可能是不同的提供商提供的。
数据库是一个典型例子。JDBC定义了Connection, Statement, PreparedStatement等一系列接口,但每个关系数据库都会有自己的一套类。这些显然不能在用户那里实现。
大概有点明白了,因为JDBC接口的原因,数据库想要通过java访问就必须实现这些接口,而不是每出现一个关系型数据库,java都必须再新添加这个数据库对应的类和方法。
如果用之前那个例子,假设Reader是不同厂商生产的,那么每推出一个Reader,就要去适应现在的规则,而不是在用户端再添加支持新出现Reader的方法。
感觉和插座有点像,不可能说新出了一个插座是10孔的,然后挨家挨户再重新装修.
不知道这么理解对不对~
【 在 nuanyangyang 的大作中提到: 】
:
: 关键是这些实现可能是不同的提供商提供的。
: 数据库是一个典型例子。JDBC定义了Connection, Statement, PreparedStatement等一系列接口,但每个关系数据库都会有自己的一套类。这些显然不能在用户那里实现。
: ...................
【 在 Lamperouge 的大作中提到: 】
: 大概有点明白了,因为JDBC接口的原因,数据库想要通过java访问就必须实现这些接口,而不是每出现一个关系型数据库,java都必须再新添加这个数据库对应的类和方法。
: 如果用之前那个例子,假设Reader是不同厂商生产的,那么每推出一个Reader,就要去适应现在的规则,而不是在用户端再添加支持新出现Reader的方法。
: 感觉和插座有点像,不可能说新出了一个插座是10孔的,然后挨家挨户再重新装修.
: ...................
显然。用户只依赖接口,而具体的提供者也实现接口,这样就降低耦合了。
对了,Python真的可以不去明确地指明“接口”。所谓的duck type,只要通过文档约定好,对象有一些方法,调用者去按名字调用这些方法,就可以工作了。Python里经常有“file-like object”的说法,就是某些方面和标准库里的“文件”有一样的行为。它们不需要有共同的父类。当然Python后来还是加入了abstract base class (abc)这个机制。
基本没学过Python,斯巴达了
【 在 nuanyangyang 的大作中提到: 】
: 对了,Python真的可以不去明确地指明“接口”。所谓的duck type,只要通过文档约定好,对象有一些方法,调用者去按名字调用这些方法,就可以工作了。Python里经常有“file-like object”的说法,就是某些方面和标准库里的“文件”有一样的行为。它们不需要有共同的父类。当然Python后来还是加入了abstract base class (abc)这个机制。