BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #41279同步于 2015/6/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

关于多态

Lamperouge
2015/6/3镜像同步24 回复
感谢各位大神的解答,现在对多态的理解清晰多了~~~ —————————————————— 最近看了下java的多态,网上资料也很多,主要都是讲:继承、重写、向上转型之类的东西,还有动态绑定,但是一直不理解多态的好处,看网上有说可替换性、可扩充性、接口性、灵活性、简化性,例子也挺多 什么猫叫、狗叫。 但是想,如果直接为每个类定义相应的方法不就行了么= = 多了个父类的方法,还被重写了。 现在唯一能想到的好处就是子类不重写父类的方法,这样能够提高代码重用性,但是这又不符合多态的定义了。。。求大神解答= = 最好能对多态的好处有能比较好理解或者直观的解释或者例子 多谢多谢~~
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nuanyangyang机器人#1 · 2015/6/3
下面的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")); // 这行可以吗? } }
Lamperouge机器人#2 · 2015/6/3
不可以,因为没有实现接口 不过我比较疑惑的地方是:如果没有BlindHelper这个接口(setBlindHelper这个类的参数也相应地变成ScreenReader)也可以实现这个功能,那么有这个接口的话如果之后还有什么BigScreenReader或者TouchReader的话完全不用修改Blind类里面的setBlindHelper方法了,那么和直接在Blind里面定义这些Helper相比,都有哪些优势呢? 【 在 nuanyangyang 的大作中提到: 】 : 下面的FileReader类也有read()方法,但它可以为盲人提供屏幕阅读服务吗? : [code=java] : class FileReader { : ...................
nuanyangyang机器人#3 · 2015/6/3
【 在 Lamperouge 的大作中提到: 】 : 不可以,因为没有实现接口 : 不过我比较疑惑的地方是:如果没有BlindHelper这个接口(setBlindHelper这个类的参数也相应地变成ScreenReader)也可以实现这个功能,那么有这个接口的话如果之后还有什么BigScreenReader或者TouchReader的话完全不用修改Blind类里面的setBlindHelper方法了,那么和直接在Blind里面定义这些Helper相比,都有哪些优势呢? 关键是这些实现可能是不同的提供商提供的。 数据库是一个典型例子。JDBC定义了Connection, Statement, PreparedStatement等一系列接口,但每个关系数据库都会有自己的一套类。这些显然不能在用户那里实现。
Lamperouge机器人#4 · 2015/6/3
大概有点明白了,因为JDBC接口的原因,数据库想要通过java访问就必须实现这些接口,而不是每出现一个关系型数据库,java都必须再新添加这个数据库对应的类和方法。 如果用之前那个例子,假设Reader是不同厂商生产的,那么每推出一个Reader,就要去适应现在的规则,而不是在用户端再添加支持新出现Reader的方法。 感觉和插座有点像,不可能说新出了一个插座是10孔的,然后挨家挨户再重新装修. 不知道这么理解对不对~ 【 在 nuanyangyang 的大作中提到: 】 : : 关键是这些实现可能是不同的提供商提供的。 : 数据库是一个典型例子。JDBC定义了Connection, Statement, PreparedStatement等一系列接口,但每个关系数据库都会有自己的一套类。这些显然不能在用户那里实现。 : ...................
nuanyangyang机器人#5 · 2015/6/3
【 在 Lamperouge 的大作中提到: 】 : 大概有点明白了,因为JDBC接口的原因,数据库想要通过java访问就必须实现这些接口,而不是每出现一个关系型数据库,java都必须再新添加这个数据库对应的类和方法。 : 如果用之前那个例子,假设Reader是不同厂商生产的,那么每推出一个Reader,就要去适应现在的规则,而不是在用户端再添加支持新出现Reader的方法。 : 感觉和插座有点像,不可能说新出了一个插座是10孔的,然后挨家挨户再重新装修. : ................... 显然。用户只依赖接口,而具体的提供者也实现接口,这样就降低耦合了。
nuanyangyang机器人#6 · 2015/6/3
对了,Python真的可以不去明确地指明“接口”。所谓的duck type,只要通过文档约定好,对象有一些方法,调用者去按名字调用这些方法,就可以工作了。Python里经常有“file-like object”的说法,就是某些方面和标准库里的“文件”有一样的行为。它们不需要有共同的父类。当然Python后来还是加入了abstract base class (abc)这个机制。
Lamperouge机器人#7 · 2015/6/3
基本没学过Python,斯巴达了 【 在 nuanyangyang 的大作中提到: 】 : 对了,Python真的可以不去明确地指明“接口”。所谓的duck type,只要通过文档约定好,对象有一些方法,调用者去按名字调用这些方法,就可以工作了。Python里经常有“file-like object”的说法,就是某些方面和标准库里的“文件”有一样的行为。它们不需要有共同的父类。当然Python后来还是加入了abstract base class (abc)这个机制。
positivesoul机器人#8 · 2015/6/3
膜拜一下~~
liu487639机器人#9 · 2015/6/3
刚看完thinking in java中的多态,以为自己起码懂了一点,看完帖子,完蛋了,就跟没看一样[ema8]