看板java
标 题Re: 人的特色只有好人与坏人吗?
发信站SayYA 资讯站 (Sun Sep 3 18:55:53 2006)
转信站ptt!ctu-reader!news.nctu!SayYa
> 发信人: [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