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

作者: lovejomi (JOMI)   2018-06-29 09:17:44
最近看到專案內一些用法覺得不太合理想提出來看大家有什麼看法
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這樣寫, 要求修改....
不是很認同,提出來請教
謝謝
作者: hsnuyi (羊咩咩~)   2018-06-29 11:56:00
(1) 用public是因為應該用內部的public protected private來控制 而不是在繼承時控制 這種做法google就有很多討論
作者: loveflames (咕啾咕啾魔法陣)   2018-06-29 12:04:00
如果是要設計成interface(is/can-do/weak is-a)那就應該採用public繼承2要不要用public是看IBarListener裡面怎麼寫,只要確保Foo跟IBarListener表面上行為一致就行除非你要搞"controlled polymorphism"上面這個技術在Exceptional C++有提過,算是C++特有
作者: shadow0326 (非議)   2018-06-29 13:16:00
大部分private繼承都可以用composition代替
作者: tinlans ( )   2018-06-29 13:29:00
private 繼承不只是哲學上 is-a 關係不存在而已,語言機制層級也會把多型禁用,寫成 private 繼承的話,IBarListener * 沒辦法指向 Foo 的 instance。
作者: loveflames (咕啾咕啾魔法陣)   2018-06-29 13:36:00
private繼承基本上用在實作繼承,而且是能用組合時就不用private繼承http://www.gotw.ca/gotw/040.htm除非要用到上面這個東西,這個也是protected繼承目前的唯一用途如果不侷限在物件導向,policy based design會很常看到private繼承,因為policy相當於private base
作者: lovejomi (JOMI)   2018-06-29 18:02:00
@tinlans, base可以指向Foo阿 只是要在Foo裡面註冊Controlled PolymorphismControlled Polymorphism還真不知道實際上用途...限制某些函數才能使用多型orz...
作者: loveflames (咕啾咕啾魔法陣)   2018-06-29 19:00:00
這用途應該很稀有,我是有想過一個"視為"的關係
作者: tinlans ( )   2018-06-29 23:19:00
註冊? 我沒有聽過這種說法,是什麼特殊平台嗎?還是說你寫個 getBase() 在 foo 讓它傳回 base?這樣拿是可以,但語法上的多型還是依然不會作用。

Links booklink

Contact Us: admin [ a t ] ucptt.com