[问题] 继承相关问题请益

楼主: 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