作者laechan (小太保)
看板mud_sanc
標題Re: [問題] inherit的問題
時間Tue Oct 29 17:00:27 2013
※ 引述《justinj (黑旋風)》之銘言:
: 我在某一個檔案merc_room.c 有設定了一個動作finish
: add_action("cmd_finish","finish")
: int cmd_finish(string str)
: {
: ....
: }
: 那我另一個檔案069.c 去 inherit 上述檔
: 然後重新增加部分的資料
: int cmd_finish(string str)
: {
: ::cmd_finish(str);
: ...... //B區塊
: ......
: }
: 那我要怎麼樣寫才會讓我執行finish指令時
: 1.當我還未完成時,不去執行B區塊,但會吐出原訊息代表未完成的訊息
: 2.當我完成時,會去執行B區塊
我猜你並不想動 merc_room.c,在這情況下如何判斷
::cmd_finish(str); 的結果是「完成」或「未完成」
比方說防具店有 sell_it 函數,然後你自己的防具店
inherit 了樣本防具店然後自訂函數
int sell_it(string str)
{
::sell_it(str);
那你的意思就接近玩家賣東西時「有賣成功=完成」
才執行 B區塊,賣失敗時就不執行,然後產生原先賣
失敗的訊息。
「則以防具店為例」一般我會這樣做
int
selling_it(string str)
{
if(this_object()->sell_it(str)>0) // return 1 時
{
B區段;
}
else
return sell_it(str);
}
會這樣寫是因為 this_object 本身 inherit 防具店
,所以 this_object 就能呼叫 sell_it。
而 >0 時它一定會出現賣出物品成功訊息同時執行 B
區段,<=0 時代表可能有 return notify_fail 的區
段代表賣出失敗,return notify_fail 有可能不會顯
示訊息,但是透過 return sell_it 該訊息就會出現
這前提是建立在
1.以防具店這個 case 為例
2.防具店的 sell_it 是用 return 1 及 return notify_fail
或是 return 0 來區別成功及失敗
假設不幸的不管它成功或失敗都是用 write + return 1
來寫,那一般我的做法是我必須先知道我繼承的 sell_it
函數本身是在執行哪些東西,這樣我才有辦法對它做
必要的判斷,例如
int sell_it(string str)
{
set("origin_objnum",objnum);
::sell_it(str);
if(obj_num!=query("origin_objnum")) // 當然實際上根本不會這樣寫
{
// 代表本次執行 ::sell_it(str) 後防具店的物品內容有改變
執行 B 區段;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.61.157.53
→ laechan :然後一般的情況使用 :: 多是基於想直接套用前人寫的 10/29 17:02
→ laechan :所以你的 case 我比較建議你自己寫, 或是就直接套用 10/29 17:03
→ laechan :前人的再自己前後加點東西,或是建立屬於自己的樣本 10/29 17:03
→ laechan :像之前你對船的樣本不滿意,其實當時可做的是更改船的 10/29 17:04
→ laechan :樣本,而不是大家都繼承樣本了,只有你的跟其它人不同 10/29 17:04
→ laechan :你可以思考的是如何讓大家繼承的船都能像你的船一樣 10/29 17:04
→ laechan :除非你的船就是真的很特別 10/29 17:06
推 justinj :了解... 10/29 18:05