Re: [问题] 练习遇到有关继承、接口、抽象类别的问题

楼主: NullLife (废材大叔有点累)   2015-09-27 14:09:19
原文吃光光,就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的时候,
才真正可以理解设计时该如何拆这些东西,达到好的弹性的架构。
因此概念懂归懂,还是要不断的写才能有深刻的体悟啊 (菸)
作者: WrongHole (Woo~)   2015-09-27 20:10:00
笑了
作者: putumaxally (putumaxally)   2015-09-28 02:35:00
有笑有推
作者: james732 (好人超)   2015-09-28 10:14:00
看到cryNorth就笑了XDDDDD
作者: alex817 (菜菜)   2015-09-28 12:18:00
很生动
作者: cha122977 (CHA)   2015-09-29 12:25:00
XD
作者: tzk28419 (甲鸟)   2015-09-29 14:27:00
超可爱的啦!推
作者: kina (玛利亚递毛巾)   2015-09-30 10:29:00
作者: jaspreme206 (handsssssome)   2015-10-03 02:30:00
推推
作者: guest62 (guest62)   2015-11-27 19:27:00
哈哈赞
作者: z5612365 (chi)   2015-12-07 06:01:00
推个

Links booklink

Contact Us: admin [ a t ] ucptt.com