Re: [問題] 類別之間的關係
※ 引述《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
→
11/18 23:48, , 1F
11/18 23:48, 1F
推
11/18 23:54, , 2F
11/18 23:54, 2F
推
11/19 00:17, , 3F
11/19 00:17, 3F
→
11/19 00:19, , 4F
11/19 00:19, 4F
→
11/19 00:20, , 5F
11/19 00:20, 5F
→
11/19 00:21, , 6F
11/19 00:21, 6F
→
11/19 00:23, , 7F
11/19 00:23, 7F
→
11/19 00:24, , 8F
11/19 00:24, 8F
→
11/19 00:25, , 9F
11/19 00:25, 9F
→
11/19 00:26, , 10F
11/19 00:26, 10F
→
11/19 00:27, , 11F
11/19 00:27, 11F
→
11/19 00:29, , 12F
11/19 00:29, 12F
→
11/19 00:30, , 13F
11/19 00:30, 13F
推
11/19 01:40, , 14F
11/19 01:40, 14F
→
11/19 01:41, , 15F
11/19 01:41, 15F
推
11/19 06:07, , 16F
11/19 06:07, 16F
討論串 (同標題文章)
OOAD 近期熱門文章
PTT數位生活區 即時熱門文章
-4
30