作者erikkk (erikkk)
看板java
标题[问题] abstraction v.s. polymorphism
时间Mon Feb 12 15:51:05 2018
物件导向
OOP
Object-Oriented Programming
OOA
Object-Oriented Analysis
从以前就从网路上得知有四大观念
但没真正搞懂这两个东西
abstraction
polymorphism
网路上的说法也不太一致
最近又再重看了一次
我这次的想法是这样
abstraction 几乎是所有 OOP 的核心思想
用简单的东西表达复杂的东西
只需要知道如何操作各种东西
不需要知道那个东西到底是怎麽被做出来的
只是 OOP 着重於用 object 来做到 abstraction
而 functional programming 着重於用 function 来做到
也因次 OOP 衍生出其他三大观念
encapsulation
inheritance
polymorphism
其中
polymorphism 在网路上也是有很多解释
我觉得只要是能用一个百变怪来代表多个东西
那就是 polymorphism
1.
如果 A1 A2 A3... 和 B 的关系
是 extends 或 implements
让 B b = (其中一个 A) a
这时百变怪 b 是(其中一个 A)
b 的函式其实是(其中一个 A)的函式
2.
override
和 1. 有点类似
但只局限於 extends 的关系
3.
overload
同一个函式名称可以代表多个功能类似但细微不同的运算
不知道我这样想对不对?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 69.181.64.182
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1518421867.A.5E0.html
如果把 extends 和 implements 都看做类似的东西
先姑且把他们都叫做继承 (大家先别玩文字游戏)
我觉得 interface 其实就是一种可以多重继承没有实体的 class
有些人会用 is-a has-a 来区分 很容易会碰到多重继承的问题
我觉得只有"未来不太可能会多重继承的"才会用 extends class 的方式
例如那篇文说 我是(is-a)上班族 我是男朋友
上班族男朋友是 interface (implements)
这和 has-a = interface 的说法相抵触
又说 BMWCar 继承(extends) Car 而且 ToyotaCar 继承 Car
同理 战斗机继承飞机 运输机继承飞机
如果未来做出能在一般道路开又能在天上飞的交通工具
那岂不是这个交通工具就没办法同时继承车子和飞机了吗?
我并不是要提倡什麽都要用 interface
的确未来什麽事(多重继承)都可能发生
但 extends class 还是有他的好处 他让很多东西都可以重复使用
所以"未来不太可能会多重继承的"还是可以用 extends class
OOP 其实有很多缺点和限制
所以 Java 做了很多相对应的 workaround
之後再用文字游戏美化这些 workaround
interface 就是其中一个例子
很多 design pattern 也是
※ 编辑: erikkk (69.181.64.182), 02/13/2018 14:15:33
2F:→ ssccg: has-a = interface的说法哪来的? has-a是composition吧 02/13 16:26
3F:→ ssccg: interface...就是interface,从外显的功能来定义 02/13 16:28
4F:→ ssccg: 你用车子和飞机会觉得冲突,是因为你定义的Car = 路上走 02/13 16:29
5F:→ ssccg: Airplane = 空中飞,这很明显是从外显功能定义是interface 02/13 16:29
6F:→ ssccg: 继承关系是以实作为本体的,Car应该是指由底盘车身引擎... 02/13 16:32
7F:→ ssccg: 以特定方式组成的类别,如果未来可以飞的车,组成方式是以 02/13 16:32
8F:→ ssccg: 现在的车子加上飞行功能,那就是Car : Flyable 02/13 16:33
9F:→ ssccg: 不然不用未来,现在飞机就能在路上走了啊 02/13 16:33
10F:→ ssccg: 如果这个外显功能不只是描述,还包含实作,现在interface 02/13 16:39
11F:→ ssccg: 也支援default method了(在OOP叫Mixin) 02/13 16:41
12F:→ erikkk: 那说法不是我说的 02/14 03:22
13F:→ erikkk: 所以你的说法是 功能用interface分 实体用extends class 02/14 03:23
14F:→ erikkk: 那如果飞机越做越像车子 车子也越做越像飞机 02/14 03:24
15F:→ erikkk: 你还是会遇到多重继承的问题 02/14 03:24
16F:→ erikkk: 你只是硬套上一个实体(架构 组成方式)不会改变的限制 02/14 03:25
17F:→ erikkk: 我猜想在这种情况下你可能就选一边站 飞机或车子 02/14 03:26
18F:→ erikkk: 或是另开一个class 02/14 03:27
19F:→ ssccg: 说真的如果两个东西接近到可以用一个类别来modeling,那 02/14 05:29
20F:→ ssccg: refactor成一个也是很正常的,我觉得不能多重继承是限制, 02/14 05:30
21F:→ ssccg: 但不是缺陷,不用提这个例子也有无数该重写的情况了 02/14 05:31