作者NullLife (........)
看板java
标题Re: [问题] 练习遇到有关继承、介面、抽象类别的问题
时间Sun Sep 27 14:09:19 2015
原文吃光光,就interface跟abstract class讲一下我体悟的概念
interface就像是技能类,例如今天你老板需要一个java人才
所以你头上挂着名为Java的interface,宣告着我会java,
然後你就可以被老板使唤(咦!?)
但做得好不好,只有你知道,你老板不会知道,
因为老板只会跟你说"东西呢?"。
因此上述这段话用code来描述就是
public interface Java {
public String coding();
}
public class You implements Java {
@Override
public String coding() {
System.out.println("要不然你来做啊"); // 这里是OS
boolean deadLineIsComing = true;
String report = deadLineIsComing ? "快好了" : "快好了";
return report; // 给老板的话
}
}
public class Boss {
public static void main(String[] args) {
Java javaSkillGuy = new You();
Boss boss = new Boss();
boss.cryNorth(javaSkillGuy);
}
public void cryNorth(Java freshLiver) {
String report = freshLiver.coding();
System.out.println(report);
}
}
上述老板的cryNorth这个method是接Java这个技能,
因此进去之後,老板只会知道你有coding这个method可以使唤,
(因为Java这个interfac里面只有coding的method)
如果你有其他例如唱歌跳舞的method可以使唤,你老板并不会知道,
因为在他cryNorth的时候是用Java来看你这个人(instance)。
那interface有什麽优点?
"过共同的介面耦合不同实作,而不需要去管实作细节,达到低耦合高内聚。"
(关於低耦合高内聚这句话请自行估狗,看不懂也没关系,
我也是写个两年後才能体悟这句话的精随,先有概念就好了。)
上述这句话套到刚刚个例子就老板需要一个会Java的人使唤(
共同的介面),
例如我跟你都会Java,都可以被使唤coding(
不同实作),
但我们写作风格、习惯不同(
实作细节),
对老板而言,他不care我们的写作风格、习惯(
不需要管实作细节),
他只知道使唤你之後必须得到一个结果(一个字串)。
那麽interface既然是技能类,就代表其实每一个人(instance)可以有好多个技能,
因此一个类可以implements好多个interface,等着需要的人来使唤你(工具人的概念)。
如果上面看懂了的话,
延伸一个思考"如果两个interface有一模一样的method同时被实作时怎麽办?"
这个问题很简单,自己实作一下,就会有答案罗。 (我当初自学也是这样学 :))
现在来谈abstract class。
这跟继承概念有关,但这里我只针对abstract method解释(因为我懒了 XD),
若看不懂的话,继承概念请再多估狗罗。
例如今天你想成一个魔法师,像我一样(咦!?)
然後魔法师这个职业拥有
戴上墨镜跟
酸酸这两个方法,
这时候我们去承袭了魔法师这个职业之後,我们就拥有了这两个方法,对吧?
然後今天突然系统改版,魔法师多了一个方法叫combo,
就是今天走在路上被闪光攻击时,会被trigger这个combo方法,
那这个方法会做
戴上墨镜>
崩溃>
酸酸这三件事,
这时候魔法师这个职业,不想知道
崩溃的细节,
(因为知道的话可能所有的魔法师都崩溃了)
因此它将
崩溃宣告为abstract,让子类去实作细节,
然後在combo里照顺序呼叫就好了。
因此我跟你就会分别实作了
崩溃,当然我们崩溃方式不一样啦 XD
总之,这个时候我们的实作里面只会看到override崩溃这个方法,乾乾净净,
看不到其他东西。
这意思是什麽?
意思就是说如果有一系列固定的动作,想让不同的人去做,
但又有其中一两个动作不一样时,
可以透过这样的方法,让子类可以专注在
崩溃上面,而不用去管其他事情。
(除非你想改变魔法师
戴上墨镜这个方法,那就overrider
戴上墨镜,
让combo呈现不同的结果,其实这也就是继承之後,能够拓展父类的概念。)
而对於放闪光攻击的人,就是呼叫combo这个方法,让你执行这三件事情。
大意上是这样,但怎麽设计又是另一门艺术,我也还在学习中。
其实上述这件事情,也可以抽出来变成一个interface,
里面包含
combo、
戴上墨镜、
崩溃、
酸酸四个方法,
然後再多一个玩家的abstract class去implements这个interface,不实作任何一个方法。
让魔法师去继承玩家,实作
combo、
戴上墨镜、
酸酸这三个方法,
将
崩溃留给子类去实作。
这样子修改之後,对於我们(子类)来说完全没有变,我们不会知道上面发生了时候事情,
但这时候放闪光的人,就可以对任何implements这个interface的玩家(或者是NPC?),
trigger combo这个方法。
(上述我懒得写code了,有兴趣自己照着描述去写code吧@@)
这样就可以在不影响实作类(就是我跟你)的状况下修改结构,让呼叫的层级拉到介面,
扩大能被调用的可能性。
其实重点就是分层的概念,我在写这支class的时候,
我不想看到或不在乎然後又会需要存在的东西,把它往上放到父类,
这样我就可以专注在自己的实作上。
以上是小弟我写了三年的心得,如有任何错误,欢迎指正。
PS:其实这个概念我很早就知道了,只是直到最近新公司,
给我极大的权限让我handle整个系统,我在开发modle的时候,
才真正可以理解设计时该如何拆这些东西,达到好的弹性的架构。
因此概念懂归懂,还是要不断的写才能有深刻的体悟啊 (菸)
--
我们全心全意的爱你 我们全心全意的爱你
亲像爱自己的母亲 亲像爱自己的母亲
不是你的土地特别香 不是你的物产特别丰富
929 吴志宁
因为你的怀抱这麽温暖 因为你用艰苦的奶 养大了我们
全心全意爱你
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.193.205.214
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1443334164.A.D51.html
1F:推 WrongHole: 笑了 09/27 20:10
2F:推 putumaxally: 有笑有推 09/28 02:35
3F:推 james732: 看到cryNorth就笑了XDDDDD 09/28 10:14
4F:推 alex817: 很生动 09/28 12:18
5F:推 cha122977: XD 09/29 12:25
6F:推 tzk28419: 超可爱的啦!推 09/29 14:27
7F:推 kina: 推 09/30 10:29
8F:推 jaspreme206: 推推 10/03 02:30
9F:推 guest62: 哈哈赞 11/27 19:27
10F:推 z5612365: 推个 12/07 06:01
11F:推 Isaea: 哈哈哈大推 05/03 01:01