→ tinlans:其實就是讓 concrete state 的 data member 指向 base 的 06/22 23:16
→ tinlans:data member,當然也能用 reference。 06/22 23:16
→ tinlans:當然更 OO 一點的方法是你先封裝 base 的 data members, 06/22 23:17
→ tinlans:提供 protected 的 getter/setter 就行了。 06/22 23:17
→ tinlans:但是更根本的問題就真的說來話長了。 06/22 23:18
→ tinlans:要分成狀態內部是否真的需要帶 instance variable, 06/22 23:19
→ tinlans:還有每個 state 是否只有一個實體 (會影響 thread-safety) 06/22 23:20
→ tinlans:來討論;光這兩大類就有 2 x 2 = 4 種細項要講。 06/22 23:20
→ tinlans:我比較好奇的是 intVar 和 floatVar 是不是應該屬於 06/22 23:24
→ tinlans:context class 的成員?如果是的話把它提到 context 去, 06/22 23:24
→ tinlans:A() 和 B() 都改成接收 Context * 就可以了。 06/22 23:24
→ tinlans:基本上,不管是你用了 static 還是 singleton,就表示它是 06/22 23:28
→ tinlans:可共用的 state,state 物件內部就不能有 data member。 06/22 23:28
→ tinlans:不然就算是 single thread 程式,你造一堆 context 物件 06/22 23:28
→ tinlans:去轉來轉去,你的資料就亂了。06/22 23:29
→ tinlans:所以在你進一步描述那兩個 data member 是幹嘛的之前,06/22 23:30
→ tinlans:我也只能這樣大方向的回你。06/22 23:30
推 QQ29:光t大說的大方向 我就很難懂了....context class是什麼意思阿06/22 23:44
感謝t大的回覆
但我也不是很瞭解t大的意思|||
抱歉,我似乎把問題簡化過頭了
我目前在做一個牌類遊戲
遊戲的主體是一個牌桌類別 (class Table)
主要運作的函式為 Update() 與 Render()
遊戲的過程分成七種狀態
最初的寫法是用 switch 判斷狀態,再去呼叫對應的函式
但函式一多以後 Table 類別就變得難以整理
所以想嘗試把每個狀態寫成一個類別
這樣每次進入 Table::Update() 和 Table::Render() 時
就呼叫目前狀態的 Update() 與 Render()
於是在將狀態獨立成單一類別的時候
我把該狀態原先在 Table 裡面要操作的 data members 移到狀態類別裡
但在這七個狀態中,又有有 3 、 2 、 2 三組子狀態的 Render() 是做一樣的事情
所以我就把重複的部分再向上提,形成如下的繼承樹
(L1) (L2) (L3)
┌StateA1
┌StateA┼StateA2
│ └StateA3
│
│ ┌StateB1
State┼StateB┴StateB2
│
│ ┌StateC1
└StateC┴StateC2
Update() 時使用 L3 類別提供的定義
Render() 時使用 L2 類別提供的定義
這樣在 L2 的類別成員用 static 宣告可行
但滿滿的 static 變數讓我有點怕(心理作用?)
所以想知道是否有除此之外的解法
=====
另外,t大在推文中提到的 context class ,不曉得是不是指文中的 Table 類別?
我有想過在 L1 的 State 類別宣告一個 Table *
在 Table 建構 L3 的狀態物件時,把 this 做為建構參數傳給它
這樣全部的狀態類別就不需要擁有 data members
但在用 Table * 操作的時候會呼叫大量的 setter/getter,讓我難以取捨
這部分不知道我有沒有會錯意?
小弟入門 OO 的時間很短
不曉得哪種寫法從 OO 的角度來看是比較好的,或是有其他更好的方法?
在此先謝謝所有回文的前輩!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.167.204.43
※ 編輯: newdominic 來自: 118.167.204.43 (06/23 01:43)
※ 編輯: newdominic 來自: 118.167.204.43 (06/23 01:45)
推 goodGG:這樣說的話,原先在 Table 裡面要操作的members,本來就該 06/23 08:05
→ goodGG:放在Table 06/23 08:05
→ goodGG:這樣語意才會集中在Table, 自然就是美 06/23 08:06
推 holymars:你可以不要自己寫輪子 boost有statechart可以用~ 06/23 13:24
推 holymars:順帶一提,boost的implement比較接近你說的第二種方法 06/23 13:27
→ holymars:連結的版本貼錯了XDy 06/23 13:28