去年我看到一些源代码(C++),其作者在基类中声明静态函数,但将其定义留给派生类。我记得有一个约束,即只有一个派生类被允许定义上述静态函数。委托给派生类的静态方法定义(C++)
我知道重写静态方法是不可能的,但这个技巧正是我所需要的。我只是不能让它在我的代码中工作:)有没有人知道这个功能?
让我们看看为什么这会有用。假设我们有一些基类(Shape)及其派生类(Circle,Triangle ...)。假设Shape是我的核心架构的一部分,派生类被视为插件。我不想在未来改变我的核心架构。所以我们有:
class Shape
{
//other stuff here
static Shape* Factory();
}
class Circle:Shape
{
//other stuff here
static Shape* Factory();
}
形状是一种抽象类,它不会实现Factory方法。方法由一个(且仅有一个)派生类实现。在实现中派生类将返回自己的新实例,所以它只是一个工厂方法。这一招使得它的作者使用的客户端类此静态方法在下列方式:
class Client
{
public Shape* shape;
public Client();
//other stuff here
}
在实现构造的,他有这样的事情:
Client::Client()
:shape(Shape::Factory())
{
}
这样,他才能够实例化“右”而不改变引擎中的核心类。当他想要在核心类中使用其他形状时,他只需要在该派生类中定义静态的Factory方法(并删除其他派生类中的现有方法)。
这样我们就有了某种“静态多态性”。我无法在网络上找到有关此技术的任何信息。它甚至有名字吗?如果在C#语言中可以实现这样的功能,我特别感兴趣? :)
在此先感谢,并抱歉我的英语不好。
删除此评论 – Kovasandra 2011-02-02 09:38:30
是的,静态方法是在派生类的cpp文件中定义的。这正是我想要实现的:)但是我无法让它在我的代码中工作,因为当我将静态类定义放入派生类cpp文件时,编译器报告基类不可访问。我想我的问题的答案是:“检查两个类是否在相同的DLL/EXE”? :)你能告诉我更多关于C#委托和相同技巧的泛型版本吗?提前致谢。 – Kovasandra 2011-02-02 09:45:24