作者sfp (Fru:z)
看板OOAD
标题Re: [问题] 类别之间的关系
时间Sun Nov 18 23:45:51 2007
※ 引述《H45 (!H45)》之铭言:
: 好!那麽该选择哪一种比较好?
: 就目前线索的答案应该是:都可以
: 如果吉娃娃未来可以咬其他的东西,不仅仅是长今
: 那麽第一种方法的吉娃娃需要增加很多方法:
: 吉娃娃.咬(长今);
: 吉娃娃.咬(第二种东西);
: 吉娃娃.咬(第三种东西);
: 这种情况最好把「咬」放在被咬的类别里面
: 也就是:
: 长今.被咬(古娃娃);
: 第二种东西.被咬(吉娃娃);
: 第三种东西.被咬(吉娃娃);
: 如此一来,每次有新的东西要被咬,就不需要更改已经写好的类别。
[部份恕删]
我觉得这边反而不是我有问题的部份...
假如吉娃娃要咬很多其他的物件, 我可能会做个《interface 可以被咬》,
然後有可能被咬的, 都去继承这个可以被咬的interface.
这样我就只要用一个方法
吉娃娃.咬(I可以被咬的东西);
反过来说, 如果会咬别人的, 不止吉娃娃一个,
那我可能就做一个 《interface 会咬人的》, 然後会咬人的都去继承它.
继承的都要实作 咬 这个method
我真正的问题是
class 医女 : I可以被咬
{
// 可以被咬可能表示这有个性质 例如 HP
// 被咬时, HP -= 受到的伤害;
}
class 狗 : I会咬人
{
public void 咬人(I可以被咬)
{
// 看要怎麽咬
}
}
然後当我在用这两个类别时
医女 长今 = new 医女();
狗 吉娃娃 = new 狗();
狗.咬(长今);
这时候 狗要直接去操作长今的HP吗?
站在 data hiding的立场 是不是长今应该提供一个 被咬 的method?
可能长这样
public void 被咬()
{
HP -= 10;
}
或许还另外提供一个
public bool IsDead() // 看有没有被咬死
{
if(HP == 0)
return true;
return false;
}
如果这样写的话 长今似乎不在乎谁咬她 她的职责是在判断自己有没有被咬死
又或者 如果需要反咬回去的话 可能写成
public void 被咬(看是谁咬她)
{
if(!IsDead())
咬回去(看是谁咬她);
// 当然这里的 "看是谁咬她" 同时继承
// 1. I会咬人 2. I会被咬 两个interface
}
好像离题太远了...
所以 不管是 吉娃娃.咬(长今);
或者是 吉娃娃去call 长今.被咬(); //可能在吉娃娃内部有一个可以被咬的handle
长今内部都要做一个 被咬 的method
public void 被咬();
这样对吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.229.55.199
1F:→ H45:呵!我看到 HP 了,如果是多对多的问题可以建立表格来管理 11/18 23:48
2F:推 H45:另外有一件我一直很在意的事情,为什麽被咬的方法没有参数输入 11/18 23:54
3F:推 abcdefghi:如果是吉娃娃和长今是tight couple,那两个都直接实作 咬 11/19 00:17
4F:→ abcdefghi:和 被咬, 然後直接呼叫就好. 如果是loose couple,就做一 11/19 00:19
5F:→ abcdefghi:个listener的object,吉娃娃咬长今时,长今要有反应,就注 11/19 00:20
6F:→ abcdefghi:册,实作这个listener,同时设为长今的friend,而长今 被咬 11/19 00:21
7F:→ abcdefghi:的反应,就写在这个listener或是listener再去呼叫长今的 11/19 00:23
8F:→ abcdefghi:被咬 这个private method. 如果吉娃娃和长今一直互咬,pk 11/19 00:24
9F:→ abcdefghi:那吉娃娃也得在初始化时,对长今注册一个listener,把各种 11/19 00:25
10F:→ abcdefghi:长今动作的反应都写进这个listener. 11/19 00:26
11F:→ abcdefghi:我想,实务上只能尽量把需求收集清楚,但最後还是看自己的 11/19 00:27
12F:→ abcdefghi:口味和未来的眼光. 11/19 00:29
13F:→ abcdefghi:对了,如果能用aggregate代替继承,就尽量少用继承. 11/19 00:30
14F:推 sfp:我对java不太熟 请问listener是不是就是observer pattern 11/19 01:40
15F:→ sfp:中的 subscriber? 11/19 01:41
16F:推 abcdefghi:是的. 11/19 06:07