> 發信人: [email protected] (好像冷氣吹太多了), 看板: java
> 標 題: Re: 人的特色只有好人與坏人嗎?
> 發信站: 批踢踢實業 (Wed Aug 30 14:16:50 2006)
> 轉信站: SayYa!ctu-reader!news.nctu!ptt
> Origin: sally.csie.ntu.edu.tw
> ※ 引述《[email protected] (web)》之銘言:
> : 人的特色只有好人與坏人嗎?
> 這麼富有哲學性的問題,既然在Java板出現了,就一定要認真地用Java的方式來回答。
> 話說,人類是萬物之靈,所以人類也是物件的一種。然而要具體形容一個人,除了外觀,
> 當然還有道德、職業、學經歷、聲望這些因素等等…這些要素,在還沒有能夠具體形容這
> 些要素前,我們能做的,就是暫時將人化做一個簡陋的抽象類別。
> package universe.earth;
> public abstract class Human {
> protected boolean isNormal;
> protected boolean isGoodGuy;
> protected String sex;
> protected double weight;
> protected double height;
> protected double BMI;
> public Human(){}
> public abstract boolean IsNormal(boolean eyebrow);
> public abstract boolean IsGoodGuy(String skill);
> public abstract void setBMI(double weight, double height);
> }
> 基本上,人類又可分為帶把與沒帶把的!皆下來我們就要實做這個帶把的男人類別,他繼
> 承自Human這個抽象類別。
呵,自己來隨意改寫看看好了。一個"人" "類"應該要有什麼樣的內容呢?如果原po
所講的,實在太多種實作取向了。若是早個一二年看到這文章,肯定只是覺得很幽
默,與版友一同歡樂觀賞。不過最進有稍為長了一點知識,這例子讓我思考了很久
我們真的要這樣做嗎? 當然這有趣的例子不是原PO用來展示設計用的,所以就讓自
我延伸練習。是否可以改用比較有彈性的作法?
以design pattern的守則之一,變動的部分要被封裝起來。所謂的變動可能是一種
主觀的認定,在只認可男與女二種性別的情況下,性別是不會有什麼變動的。所以
,這一部分通常關於專案的特性而有所差別。而"人"是好人或壞人,則是屬性一個
人的特質,或個性。但一個人的特質與個性往往難以估計有多少描述方式與分類,
暫且認為其為變動的部分,應該被封裝起來。
要如何來實現封裝這一個動作,回想起剛學習java還不懂封起來要做什麼,除了資
料成了黑盒子內的寶物之外,我們只看得到封裝後所提供的介面。他到底有什麼好
呢? 基本上的好處是擴充性,因為不必被侷限於base class。只要多加個implements
就多了點東西,base class是牽一髮而動全身的。一但把什麼都塞到base class後
,那只要需求改變了,子類別全都要跟著改變。
俺用極端一點的風格,寫下了這個空虛的人類:
====================================================================== #
public class HumanBeing {
}
人活著不能如此空虛,回頭看看原先的實作,我們需要一點基本資料。
但是基本資料所蒐集的內容也不盡相同,在這不確定的年代,
我們要為適應變動而設想。將之獨立成"基本資料"介面
====================================================================== #
public interface GeneralInformation {
public void setName(String name);
public String getName();
public void setHeight(double height);
public double getHeight();
public void setWeight(double weight);
public double getWeight();
}
public class HumanBeing implements GeneralInformation{
.................
}
一個有基本資料的人,我們可以為了這人的用途不同附加不同的介面。
例如為作家提供經歷、著作等資料的界面。為個性,提供個性集合的介面;
為個人特質、狀態提供介面
====================================================================== #
import java.util.Set;
public interface Traits {
public void setTraits(Set<Trait> traits);
public Set<Trait> getTraits();
public void addTrait(Trait t);
}
public class Trait {
String description;
}
public class HumanBeing implements GeneralInformation, Traits{
...............
}
(再加一個諮商記錄幾乎就是諮商師用的application了..orz)
==============================================================
由這樣的想法,為一個基本的人提供不同的介面。而可用於不同的用途
,比起繼承的方式要容易維護。
此外,由這一篇內容也聯想到,人的特質、好人、壞人等"形容詞"修飾
也適合用裝飾者模式來作。好人、壞人通通都是人,符合裝飾著的基本
條件,裝飾者的型態和被裝飾者是同一個型態 (實作上利用繼承的方式
達到同型態的目的,但把加料的部分塞在method以override的手法達成
)。
class 神奇寶貝 {}
interface 基本資料 {學名、生長地區、基本型態}
interface 攻擊系統 {一般攻擊、必殺技、攻擊加乘}
class 神奇寶貝原型 extends 神奇寶貝
implements 基本資料, 攻擊系統{}
class 皮卡丘 extends 神奇寶貝原型{
學名: 皮卡丘
生長地區: foo place
基本型態: foo type
一般攻擊: foo action , 加乘 * 1.2
必殺技: killer action, 加乘 * 12 (傳說中的十萬伏特電擊!?)
攻擊加乘: 1 * 攻擊型態加乘 + bouns
}
用裝飾者修飾皮卡丘
class 爆走皮卡丘 extends 皮卡丘{
皮卡丘 p;
public 爆走皮卡丘(皮卡丘 p)
一般攻擊: 加乘* p.攻擊加乘 * 10;
必殺技: 加乘* p.攻擊加乘 * 10^1.5;
}
class 好人皮卡丘 extends 皮卡丘{
皮卡丘 p;
public 爆走皮卡丘(皮卡丘 p)
一般攻擊: 加乘* p.攻擊加乘 * 0.1;
必殺技: 加乘* p.攻擊加乘 * 0.9;
}
orz..好唄。真是一整個胡言亂語。
--
※ Origin: SayYA 資訊站 <bbs.sayya.org>
◆ From: 163.26.34.20