【发布时间】:2011-06-19 13:40:25
【问题描述】:
去年我看到了一些源代码 (C++),它的作者在基类中声明了静态函数,但将其定义留给了派生类。我记得有一个限制,只允许一个派生类定义上述静态函数。
我知道重写静态方法是不可能的,但是这个技巧正是我所需要的。我只是无法让它在我的代码中工作:) 有人知道这个功能吗?
让我们看看为什么这会有用。假设我们有一些基类(Shape)和它的派生类(Circle、Triangle...)。假设 Shape 是我核心架构的一部分,派生类被视为插件。我不想在未来改变我的核心架构。所以我们有:
class Shape
{
//other stuff here
static Shape* Factory();
}
class Circle:Shape
{
//other stuff here
static Shape* Factory();
}
Shape 是一种抽象类,它不会实现工厂方法。方法由一个(并且只有一个)派生类实现。在实现派生类将返回自己的新实例,所以它只是一个工厂方法。这个技巧允许它的作者通过以下方式在客户端类中使用这个静态方法:
class Client
{
public Shape* shape;
public Client();
//other stuff here
}
在构造函数的实现中,他有类似的东西:
Client::Client()
:shape(Shape::Factory())
{
}
通过这种方式,他能够实例化“正确”的形状推导,而无需更改引擎中的核心类。当他想在核心类中使用其他形状时,他只需要在该派生类中定义静态工厂方法(并删除其他派生类中的现有方法)。
这样我们就有了某种“静态多态性”。我在网上找不到有关此技术的任何信息。它甚至有名字吗?如果这样的事情可以用 C# 语言实现,我特别感兴趣? :)
提前致谢,抱歉我的英语不好。
【问题讨论】: