gpt4 book ai didi

使用工厂的 C++ 接口(interface)继承

转载 作者:行者123 更新时间:2023-11-30 05:15:21 25 4
gpt4 key购买 nike

我正在使用一个库,它有一个特定功能的接口(interface),以及一些功能的实现。该库还提供了一个 Factory 对象,用于实例化正确的功能实现。

我需要通过向对象添加新方法来扩展相关功能,我想通过创建一个继承自库接口(interface)并推出我自己的实现的新接口(interface)来实现。

例如:

class IFromLibrary
{
virtual void LibraryMethod(void) = 0;
}

class IMyInterface : public IFromLibrary
{
virtual void MyMethod(void) = 0;
int SomeValue;
}

class TMyImplementation : public IMyInterface
{
void LibraryMethod(void) { ... }
void MyMethod(void) { ... }
}

我面临的问题是创建 TMyImplementation 实例。正如我所说,该库将实现的构造函数隐藏为私有(private)成员,并使用 Factory 静态方法来构造对象。

示例:

static IFromLibrary * createFromLibrary(int whatever) { ... }

因为它是库的范例,我也试图通过在我的实现类中创建我自己的 create 来做到这一点:

static IMyInterface * createMyImplementation(int whatever) { ... }

我遇到的问题是我希望我新实例化的对象将使用库的工厂提供的值来构造:

static IMyInterface * createMyImplementation(int whatever)
{
IMyInterface * newObject = createFromLibrary(whatever); // this doesn't compile, evidently.
newObject->SomeValue = SomeOtherValue; // init the parts of the object that belong to my interface
}

我试图避免适配器模式(即在我的 TMyImplementation 类中包装一个 IFromLibrary 指针并转发从 IFromLibrary 继承的所有方法调用)。这确实可行,但从我的角度来看,从架构上讲,我发现同时继承和包装一个类很奇怪。如果可能的话,我还想避免所有转发样板代码。

这可以通过任何方式完成吗?

编辑:

  • 添加了私有(private)构造函数仅用于实现的事实(抱歉@NirFriedman 造成的混淆)。
  • 说明了我想要(如果可能的话)避免适配器模式的原因(感谢@immibis 提供模式名称)。

最佳答案

您可以使用 decorator pattern (我之前说的“适配器模式”不正确 - they are quite similar though) - 让你的 TMyImplementation 对象将 LibraryMethod 委托(delegate)给你从中获得的 IFromLibrary 对象图书馆:

class TMyImplementation : public IMyInterface
{
IFromLibrary *base;
public:
TMyImplementation(IFromLibrary *base) : base(base) {}
~TMyImplementation() {delete base;} // ideally you would use a unique_ptr instead

void LibraryMethod() {base->LibraryMethod();}
void MyMethod() {...}
};

然后要创建一个 TMyImplementation,您可以使用 new TMyImplementation(createFromLibrary(whatever))

(请注意,模式只是设计的起点,而不是要严格遵守的规则!例如,根据您的设计,您可以将 createFromLibrary 调用移动到构造函数中)

关于使用工厂的 C++ 接口(interface)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43128013/

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