看板 C_and_CPP 關於我們 聯絡資訊
這個問題其實比較偏向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
uranusjr:1. C 語言沒有 class 更沒有 public/private, 是 C++ 吧 04/23 18:43
uranusjr:如果要存取很多不想公開的私有成員, 那代表你根本不應該 04/23 18:43
uranusjr:把這些東西分出去; 如果一定要分, 那就用 friend 04/23 18:44
uranusjr:不然就是直接把那個大 class 變成繼承 hierachy 的一部份 04/23 18:45
uranusjr:這樣就可以用 protected 來存取 04/23 18:46
uranusjr:用你在 OOAD 板寫的架構, 就是把 B 融進 A 裡面, 然後 C 04/23 18:48
uranusjr:系列都繼承 A 04/23 18:48
uranusjr:啊, 還有一個方法是, 如果你每次用到那些私有成員的原因 04/23 18:52
uranusjr:都一樣, 可以把同樣用到那些成員的邏輯移到 A 裡面 04/23 18:52
firejox:咦 不是原本就可以直接標記protected成員嗎? 04/23 18:59
iamstudent:是c++沒錯,標題正確內文打錯 04/23 19:11
iamstudent:如果直接把大的class作成那個繼承體系 04/23 19:20
iamstudent:後果是無法動態變化行為 04/23 19:21
iamstudent:所以才會希望寫成擁有另外一個繼承體系的指標 04/23 19:22
iamstudent:然後執行期可以變更成其他實體子類別,來切換功能性 04/23 19:23
iamstudent:所以架構是這樣子 A裡面有一個B*, C1~Cn繼承B 04/23 19:41
iamstudent:然後A裡面委託B的指標做事情,而B的指標可以指向C1~Cn 04/23 19:42
※ 編輯: iamstudent 來自: 140.113.210.62 (04/23 19:43) ※ 編輯: iamstudent 來自: 140.113.210.62 (04/23 20:52)