这是我的第一篇文章,所以要善良.这是我最近得到的一个面试问题,但我在搜索后找不到答案(谷歌,C++ FAQ等).
存在具有行为b1()的接口I1.有A,B,C三个等级.所有这些类都通过覆盖b1()来实现接口I1.存在第四类D,其具有在接口I1中定义的行为(b1)和额外行为b2
问题是你如何设计课程D.
我的答案是创建另一个接口I2,它定义行为b2()并使类D通过覆盖b1()和b2()实现I1和I2(C++中的多重继承)
采访者同意解决方案,但询问如果将来有新的行为出现的新课程,我们将如何处理
我只能考虑添加更多的接口(I3,I4等)并进行多重继承,但我知道你最终会在大量具有相应接口的派生类中
面试官似乎期待更好的解决方案,但他没有透露答案.我很想知道这里的专家如何解决这个设计问题.
PS:经过认真思考后,我认为答案可能在于使用设计模式,但看看常见的设计模式,我找不到任何与此问题相符的模式
编辑1:我有更多的问题和澄清,所以在这里编辑帖子,不确定这是否正确或我需要发布这个作为我自己的问题的答案.
首先让我感谢@Nawaz,@ Alexandre和@Sjoerd的宝贵意见.我刚刚开始学习C++ /设计模式中的设计方面,所以请原谅我对这个主题的无知.
@Nawaz的Vistor模式的例子非常有用,但我想这只是访问者提出的原始问题的一个特例.@Alexandre正确地指出了这里的场景.
让我解释一下这个的另一个方面.当我们谈论行为时,我们需要基于它们对它们进行分组
1)与一组对象或对象相关的常见行为.(这是直观的,或者可以在现实世界中观察到)例如:Dude的行为(以@Nawaz为例) - 我,走路,吃饭,学习等
2)与小组相关的不常见或非常特殊的行为(这是反直觉的)例如:仅仅为了争论,考虑一个组成音乐的家伙(我知道这个例子不完美)
3)与小组完全无关的行为.我想不出一个例子,但我的观点是让我们说出一些奇怪的原因我们需要给对象这个行为.
所以我认为访客模式可以解决1)中的问题,但我怀疑它不适用于2)和3).
以IDude为例,我们需要进行以下更改才能成为可以创作音乐的Dude.
class IComposerBehavior;
class IComposer
{
public:
virtual ~IComposer() {}
virtual void accept(IComposerBehavior *behaviour) = 0 ;
};
class IComposerBehavior
{
public:
virtual ~IComposerBehavior() {}
virtual void visit(IComposer * ) = 0;
};
class Dude : public IDude, public IComposer
{
public:
virtual void accept(IDudeBehavior *behaviour)
{
behaviour->visit(this);
}
virtual void accept(IComposerBehavior *behaviour)
{
behaviour->visit(this);
}
};
class SymphonyComposerBehavior …
Run Code Online (Sandbox Code Playgroud)