我有一个基类和几个派生类。派生类具有通用方法,例如activate()
或init()
,它们以稍微不同的方式实现。所以,我让activate()
和init()
纯虚拟。
然后,像doSomething()
这样的方法,90%的派生类以不同的方式使用。其他10%不需要该功能。
继承doSomething()
如下所示是合理的做法吗?
基类:
class base {
public:
virtual void activate() = 0;
virtual void init() = 0;
virtual void doSomething(){ /* internal log that the function is not implemented */ };
};
派生类:
class derivedA: public base {
public:
virtual void activate() override { /* activate A */ };
virtual void init() override { /* init A */ };
virtual void doSomething() override { /* do something in A */ };
};
//class derivedB to class derivedI like class derivedA
class derivedJ: public base {
public:
virtual void activate() override { /* activate J */ };
virtual void init() override { /* init J */ };
// doSomething() is not overriden and the implementation of base is used
};
这是一种可行的方法,还是建模可能存在问题?
答案 0 :(得分:3)
建模可能有问题吗?
当然!
我希望derivedJ
继承自base
,然后才会使用doSomething()
(这与实现无关)。
但是,您希望derivedJ
类不提供此方法,因此您应该更改建模。
一个天真的解决方案是修改你的base
类,删除该功能,如下所示:
class base {
public:
virtual void activate() = 0;
virtual void init() = 0;
};
答案 1 :(得分:0)
如果从base
派生的至少一个类在概念上不需要实现doSomething()
,那么doSomething()
不应该是base
的接口的一部分,并且所以它需要进入另一个界面。
也就是说,doSomething()
应该是另一个抽象基类的一部分,称之为base2
。
如果doSomething()
可以(或不应该)与activate()
和init()
分开使用,则从base2
派生base
并导出derivedA
来自derivedI
的{{1}}和来自base2
的{{1}}。
如果可以,请将derivedJ
作为单独的类保留,并从base
和base2
派生derivedA
到derivedI
,并且只导出base
1}}来自base2
。