[問題] Strategy/State Pattern in C++

看板C_and_CPP (C/C++)作者 (stu)時間15年前 (2011/04/23 18:22), 編輯推噓0(0017)
留言17則, 3人參與, 最新討論串1/3 (看更多)
這個問題其實比較偏向code refactoring 我有發文到OOAD版上 不過好像沒什麼人去那個版 所以我另外到這裡再問看看各位先進 看看大家會怎麼做 已經有一個很大的class 裡面也有很多物件和資源 也有提供一些介面函數會工作 但是因為工作的方式與內容會變化 所以把會變化的部份抽離出來 另外變成一個abstract class 然後再個別繼承出每個狀態並實作出來 使用時可以切換實體 利用virtual function和多型變化 成為strategy pattern 可以省卻一堆判斷式和擴充問題 問題是這個抽出來的繼承體系有很多小class 他們都需要存取原本大class內部的物件 可是C語言裡面,要存取private成員 就只能用friend或是該大class物件提供的public method 所以方法變成只有兩種:(如果還有更多,請指教) 方法a: 大class去friend所有的state子類別 方法b: 大class設計好低階的public介面函數,然後抽出去的類別只用這些介面存取 問題是這兩個方法感覺都不夠好 方法a會有超多的friend敘述 而方法b有的時候還真的設計不出來 OOAD版上有人提供了方法c:把大class的所有成員物件改public 這個也不是我要的 因為等於直接暴露整個內容出去了 那麼還有其他方法嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.210.62

04/23 18:43, , 1F
1. C 語言沒有 class 更沒有 public/private, 是 C++ 吧
04/23 18:43, 1F

04/23 18:43, , 2F
如果要存取很多不想公開的私有成員, 那代表你根本不應該
04/23 18:43, 2F

04/23 18:44, , 3F
把這些東西分出去; 如果一定要分, 那就用 friend
04/23 18:44, 3F

04/23 18:45, , 4F
不然就是直接把那個大 class 變成繼承 hierachy 的一部份
04/23 18:45, 4F

04/23 18:46, , 5F
這樣就可以用 protected 來存取
04/23 18:46, 5F

04/23 18:48, , 6F
用你在 OOAD 板寫的架構, 就是把 B 融進 A 裡面, 然後 C
04/23 18:48, 6F

04/23 18:48, , 7F
系列都繼承 A
04/23 18:48, 7F

04/23 18:52, , 8F
啊, 還有一個方法是, 如果你每次用到那些私有成員的原因
04/23 18:52, 8F

04/23 18:52, , 9F
都一樣, 可以把同樣用到那些成員的邏輯移到 A 裡面
04/23 18:52, 9F

04/23 18:59, , 10F
咦 不是原本就可以直接標記protected成員嗎?
04/23 18:59, 10F

04/23 19:11, , 11F
是c++沒錯,標題正確內文打錯
04/23 19:11, 11F

04/23 19:20, , 12F
如果直接把大的class作成那個繼承體系
04/23 19:20, 12F

04/23 19:21, , 13F
後果是無法動態變化行為
04/23 19:21, 13F

04/23 19:22, , 14F
所以才會希望寫成擁有另外一個繼承體系的指標
04/23 19:22, 14F

04/23 19:23, , 15F
然後執行期可以變更成其他實體子類別,來切換功能性
04/23 19:23, 15F

04/23 19:41, , 16F
所以架構是這樣子 A裡面有一個B*, C1~Cn繼承B
04/23 19:41, 16F

04/23 19:42, , 17F
然後A裡面委託B的指標做事情,而B的指標可以指向C1~Cn
04/23 19:42, 17F
※ 編輯: iamstudent 來自: 140.113.210.62 (04/23 19:43) ※ 編輯: iamstudent 來自: 140.113.210.62 (04/23 20:52)
文章代碼(AID): #1DigXwey (C_and_CPP)
文章代碼(AID): #1DigXwey (C_and_CPP)