gpt4 book ai didi

c++ - 委托(delegate)给派生类的静态方法定义(c++)

转载 作者:太空宇宙 更新时间:2023-11-04 14:24:50 26 4
gpt4 key购买 nike

去年我看到一些源代码(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# 语言实现这样的事情? :)

提前致谢,抱歉我的英语不好。

最佳答案

在我看来,您尝试做的事情听起来有点困惑。感觉就像是工厂类、单例类的组合,然后试图将它们全部压缩回您的结果类层次结构中。

我能想到的最简单(不一定是最好的)解决方案是忘记使用 Circle::Factory()Shape::Factory() 而只是有一个名为 get_default_shape() 的免费函数。

class Shape
{
};

class Circle: public Shape
{
};

Shape * get_default_shape()
{
return new Circle;
}

Client::Client()
:shape(get_default_shape())
{
}

关于此的好处是它只有 get_default_shape 的实现需要包含 Circle.h,所有定义需要的是 Shape 类的前向声明。

关于c++ - 委托(delegate)给派生类的静态方法定义(c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4867925/

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