gpt4 book ai didi

c++ - C++中的静态抽象方法

转载 作者:IT老高 更新时间:2023-10-28 21:55:38 24 4
gpt4 key购买 nike

我有一个抽象基类

class IThingy
{
virtual void method1() = 0;
virtual void method2() = 0;
};

我想说——“所有提供具体实例化的类也必须提供这些静态方法”

我很想这样做

class IThingy
{
virtual void method1() = 0;
virtual void method2() = 0;
static virtual IThingy Factory() = 0;
};

我知道它不能编译,无论如何它也不清楚如何使用它,即使它编译了。无论如何我都可以做

Concrete::Factory(); // concrete is implementation of ITHingy

根本没有在基类中提及工厂。

但我觉得应该有某种方式来表达我希望实现签署的契约(Contract)。

有没有一个众所周知的成语?还是我只是把它放在评论中?也许我不应该试图强制这一点

编辑:当我输入问题时,我会感到自己含糊其辞。我只是觉得应该有某种方式来表达它。伊戈尔给出了一个优雅的答案,但实际上它表明它确实无济于事。我最终还是不得不做

   IThingy *p;
if(..)
p = new Cl1();
else if(..)
p = new Cl2();
else if(..)
p = new Cl3();
etc.

我想像 c#、python 或 java 这样的反射性语言可以提供更好的解决方案

最佳答案

您遇到的问题部分与轻微违反单一责任原则有关。您试图通过接口(interface)强制创建对象。相反,接口(interface)应该更纯粹,并且只包含接口(interface)应该做的事情所不可或缺的方法。

相反,您可以从接口(interface)(所需的 virtual static 方法)中取出创建并将其放入工厂类中。

这是一个简单的工厂实现,它在派生类上强制使用工厂方法。

template <class TClass, class TInterface>
class Factory {
public:
static TInterface* Create(){return TClass::CreateInternal();}
};

struct IThingy {
virtual void Method1() = 0;
};

class Thingy :
public Factory<Thingy, IThingy>,
public IThingy {
//Note the private constructor, forces creation through a factory method
Thingy(){}
public:
virtual void Method1(){}
//Actual factory method that performs work.
static Thingy* CreateInternal() {return new Thingy();}
};

用法:

//Thingy thingy; //error C2248: 'Thingy::Thingy' : cannot access private member declared in class 'Thingy'

IThingy* ithingy = Thingy::Create(); //OK

源自 Factory<TClass, TInterface> ,派生类被编译器强制有一个 CreateInternal 方法。不定义它会导致这样的错误:

error C2039: 'CreateInternal' : is not a member of 'Thingy'

关于c++ - C++中的静态抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3313754/

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