[問題] 繼承相關問題請益

看板C_and_CPP (C/C++)作者 (JOMI)時間7年前 (2018/06/29 09:17), 編輯推噓1(1027)
留言28則, 5人參與, 7年前最新討論串1/1
最近看到專案內一些用法覺得不太合理想提出來看大家有什麼看法 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

06/29 11:56, 7年前 , 1F
(1) 用public是因為應該用內部的public protected private
06/29 11:56, 1F

06/29 11:56, 7年前 , 2F
來控制 而不是在繼承時控制 這種做法google就有很多討論
06/29 11:56, 2F

06/29 12:04, 7年前 , 3F
如果是要設計成interface(is/can-do/weak is-a)
06/29 12:04, 3F

06/29 12:05, 7年前 , 4F
那就應該採用public繼承
06/29 12:05, 4F

06/29 12:06, 7年前 , 5F
2要不要用public是看IBarListener裡面怎麼寫,只要確
06/29 12:06, 5F

06/29 12:06, 7年前 , 6F
保Foo跟IBarListener表面上行為一致就行
06/29 12:06, 6F

06/29 12:11, 7年前 , 7F
除非你要搞"controlled polymorphism"
06/29 12:11, 7F

06/29 12:11, 7年前 , 8F
上面這個技術在Exceptional C++有提過,算是C++特有
06/29 12:11, 8F

06/29 13:16, 7年前 , 9F
大部分private繼承都可以用composition代替
06/29 13:16, 9F

06/29 13:29, 7年前 , 10F
private 繼承不只是哲學上 is-a 關係不存在而已,
06/29 13:29, 10F

06/29 13:30, 7年前 , 11F
語言機制層級也會把多型禁用,寫成 private 繼承的話,
06/29 13:30, 11F

06/29 13:31, 7年前 , 12F
IBarListener * 沒辦法指向 Foo 的 instance。
06/29 13:31, 12F

06/29 13:36, 7年前 , 13F
private繼承基本上用在實作繼承,而且是能用組合時就
06/29 13:36, 13F

06/29 13:36, 7年前 , 14F
不用private繼承
06/29 13:36, 14F

06/29 13:37, 7年前 , 15F

06/29 13:37, 7年前 , 16F
除非要用到上面這個東西,這個也是protected繼承目前
06/29 13:37, 16F

06/29 13:38, 7年前 , 17F
的唯一用途
06/29 13:38, 17F

06/29 13:44, 7年前 , 18F
如果不侷限在物件導向,policy based design會很常看
06/29 13:44, 18F

06/29 13:44, 7年前 , 19F
到private繼承,因為policy相當於private base
06/29 13:44, 19F

06/29 18:02, 7年前 , 20F
@tinlans, base可以指向Foo阿 只是要在Foo裡面註冊
06/29 18:02, 20F

06/29 18:09, 7年前 , 21F
Controlled Polymorphism
06/29 18:09, 21F

06/29 18:09, 7年前 , 22F
Controlled Polymorphism
06/29 18:09, 22F

06/29 18:09, 7年前 , 23F
還真不知道實際上用途...限制某些函數才能使用多型orz..
06/29 18:09, 23F

06/29 18:09, 7年前 , 24F
.
06/29 18:09, 24F

06/29 19:00, 7年前 , 25F
這用途應該很稀有,我是有想過一個"視為"的關係
06/29 19:00, 25F

06/29 23:19, 7年前 , 26F
註冊? 我沒有聽過這種說法,是什麼特殊平台嗎?
06/29 23:19, 26F

06/29 23:21, 7年前 , 27F
還是說你寫個 getBase() 在 foo 讓它傳回 base?
06/29 23:21, 27F

06/29 23:27, 7年前 , 28F
這樣拿是可以,但語法上的多型還是依然不會作用。
06/29 23:27, 28F
文章代碼(AID): #1RDOYwAd (C_and_CPP)
文章代碼(AID): #1RDOYwAd (C_and_CPP)