【发布时间】:2011-03-19 19:55:53
【问题描述】:
我有一个抽象基类
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
根本没有在基类中提及工厂。
但我觉得应该有某种方式来表达我希望实现签署的合同。
有没有一个众所周知的成语?还是我只是把它放在 cmets 中?也许我不应该试图强迫这一点
编辑:当我输入问题时,我会感到自己含糊其辞。我只是觉得应该有某种方式来表达它。伊戈尔给出了一个优雅的答案,但实际上它表明它确实没有帮助。我最终还是不得不做
IThingy *p;
if(..)
p = new Cl1();
else if(..)
p = new Cl2();
else if(..)
p = new Cl3();
etc.
我想像 c#、python 或 java 这样的反射性语言可以提供更好的解决方案
【问题讨论】:
-
我不太确定你想要什么。您在寻找
clone方法吗? -
我想我并没有真正看到你需要这样的东西的真实情况?多态性只有在实际实例中才真正有意义。静态方法只是使用 MRO 的类名的常规函数。真的没有意义,在某些时候你必须知道 class::method 的名称,因为 c++ 是静态链接的。
-
他似乎想指定子类有一个静态工厂方法。布莱恩,你应该把它移到答案空间。
-
不完全是静态虚拟方法,但您可以尝试在调用受保护
T::InternalMyMethod()的抽象类中提供静态模板方法template<class T> static MyMethod()。如果调用了T:MyMethod<T>(),这将强制从您的抽象类继承的任何类实现static T::InternalMyMethod()。