gpt4 book ai didi

c++ - 如何在派生类中使用带有附加方法的策略模式

转载 作者:搜寻专家 更新时间:2023-10-31 00:51:29 26 4
gpt4 key购买 nike

我正在编写一个使用策略的项目,但是,我的派生类具有基类不应该具有的其他附加功能。

class Base {
public:
virtual void execute() = 0;
virtual void print() const noexcept = 0;
virtual ~Base() {}
};


class DerivedA : public virtual Base {
public:
void execute() override;
void print() const noexcept override;
void doSomething();

private:
int x;
double y;
};

class DerivedB final : public Base {
public:
void execute() override;
void print() const noexcept override;
std::string getZ() const noexcept;

private:
std::string z;
};


在 main() 中,我尝试使用 dynamic_cast 来使用这样的附加功能:

int main() {

DerivedA da;
Base* base = &da;
DerivedA* derivedA = dynamic_cast<DerivedA*>(base);
derivedA.doSomething();

return 0;
}


但是当我尝试运行代码时,出现以下错误:

“DerivedA *”与“DerivedA”的间接级别不同


我的问题是,我应该为此使用策略,还是应该使用另一种设计模式?如果我应该使用策略,我该如何解决这个错误?


更新

我正在考虑切换到装饰器,因为 DerivedA 可以是 DerivedB 的基类,但是,我担心转换,因为每个类都有不同的类成员。


更新

好像我写错了类型转换。但是,我在这里发布时写对了!它现在可以工作了,但是,我同意有更好的方法来实现它。

最佳答案

如果这正是您要编译的代码,那么解决方案很简单。而不是

derivedA.doSomething();

你应该写

derivedA->doSomething();

因为 derived 是指针,而不是引用或实例。

但是,对于考虑 dynamic_cast,我确实还有其他一些严重的担忧。我的意见是,如果您使用 dynamic_cast,则您的设计可能有问题。您有一个隐藏实现的接口(interface),但有依赖于实现而不是接口(interface)中的代码。

一些可供考虑的备选方案:

  • 尝试将特定于实现的方法转换为在界面上有意义的方法。也许您可以找到所有实现的一些共同概念。
  • 将特定于实现的方法提取到“能力”接口(interface)中,并在接口(interface)中提供功能以获得“能力”接口(interface)。例如。如果您的基类是 IAnimal,并且您的一些动物会游泳,请创建一个接口(interface) ISwimmable 并向 IAnimal 添加一个返回指针的方法到 ISwimmable (IAnimal::getSwimmable)。可以游泳的动物实现,可以继承自 ISwimmable 并实现 getSwimmable 并返回指向 ISwimmable 接口(interface)的指针(所以实际上,返回本身,这只是隐含的本身)。不会游泳的动物可以返回一个 nullptr(这可能是 IAnimal 中的默认实现或某些 AnimalBase 类继承自 IAnimal 如果你想让界面保持纯界面)。

这第二种方法也被微软的 COM 系统使用,其中每个 COM 接口(interface)都实现了 IUnknown 接口(interface),您可以在其中调用 IUnknown 来获得特定的、不同的接口(interface)对于一些“能力”。

关于c++ - 如何在派生类中使用带有附加方法的策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55040154/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com