看板 C_and_CPP 關於我們 聯絡資訊
最近看到專案內一些用法覺得不太合理想提出來看大家有什麼看法 class Foo : public / private IBarListener (1) { public / private: (2) void OnBarXxx() override; public: Foo(){ 這邊會把this 註冊給listener} }; 以上(1)(2)有四種組合 我自己覺得都該用public 較為合理 我的想法是 1. c# java 等語言繼承interface也必須維持在public field(雖然我無法明確說出這樣 的用意) 2. private繼承 語意上變成了"has a" 根本不太合理 這邊剛好是在自己的建構子註冊給 別人,別人才能用base pointer來接. 3. 寫在public field 我認為好處是 有可能別人不是用base class接 卻想callback,如果有這需求就不需改code 另外就是unit test也可以直接呼叫. 但這邊盲點就是,其實別人不該直接invoke concrete class的 callback, 擺在private 似乎也合理? 因為被盲目的說大家習慣都用private這樣寫, 要求修改.... 不是很認同,提出來請教 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 27.242.203.236 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1530235066.A.2A7.html
hsnuyi: (1) 用public是因為應該用內部的public protected private 06/29 11:56
hsnuyi: 來控制 而不是在繼承時控制 這種做法google就有很多討論 06/29 11:56
loveflames: 如果是要設計成interface(is/can-do/weak is-a) 06/29 12:04
loveflames: 那就應該採用public繼承 06/29 12:05
loveflames: 2要不要用public是看IBarListener裡面怎麼寫,只要確 06/29 12:06
loveflames: 保Foo跟IBarListener表面上行為一致就行 06/29 12:06
loveflames: 除非你要搞"controlled polymorphism" 06/29 12:11
loveflames: 上面這個技術在Exceptional C++有提過,算是C++特有 06/29 12:11
shadow0326: 大部分private繼承都可以用composition代替 06/29 13:16
tinlans: private 繼承不只是哲學上 is-a 關係不存在而已, 06/29 13:29
tinlans: 語言機制層級也會把多型禁用,寫成 private 繼承的話, 06/29 13:30
tinlans: IBarListener * 沒辦法指向 Foo 的 instance。 06/29 13:31
loveflames: private繼承基本上用在實作繼承,而且是能用組合時就 06/29 13:36
loveflames: 不用private繼承 06/29 13:36
loveflames: http://www.gotw.ca/gotw/040.htm 06/29 13:37
loveflames: 除非要用到上面這個東西,這個也是protected繼承目前 06/29 13:37
loveflames: 的唯一用途 06/29 13:38
loveflames: 如果不侷限在物件導向,policy based design會很常看 06/29 13:44
loveflames: 到private繼承,因為policy相當於private base 06/29 13:44
lovejomi: @tinlans, base可以指向Foo阿 只是要在Foo裡面註冊 06/29 18:02
lovejomi: Controlled Polymorphism 06/29 18:09
lovejomi: Controlled Polymorphism 06/29 18:09
lovejomi: 還真不知道實際上用途...限制某些函數才能使用多型orz.. 06/29 18:09
lovejomi: . 06/29 18:09
loveflames: 這用途應該很稀有,我是有想過一個"視為"的關係 06/29 19:00
tinlans: 註冊? 我沒有聽過這種說法,是什麼特殊平台嗎? 06/29 23:19
tinlans: 還是說你寫個 getBase() 在 foo 讓它傳回 base? 06/29 23:21
tinlans: 這樣拿是可以,但語法上的多型還是依然不會作用。 06/29 23:27