二折多态性很奇怪,如何使其可扩展?
Two folded polymorphism is weird, how to make it extensible?
比如我有一个抽象基classA
和B
。 A
有一个虚方法如下
class A
{
public:
virutal void f(B& b) = 0;
};
对于class A1
class A1 : public A
{
public:
void f(B& b) override { b.f(A1); }
};
因此对于B
,它需要一个虚拟方法f(A1)
class B
{
public:
virtual void f(A1& a) = 0;
};
而在class B1 : public B
中实现了虚方法。问题是,当添加另一个 class A2 : public A
时,我必须在 class B
中添加一个虚拟方法 virtual void f(A2& a) = 0
,我认为这破坏了代码,因为我没有知道我设计class B
的时候加不加A2
甚至A1
。如何避免它但执行等效要求?任何 C++ 功能都可以与模板一起使用。
不幸的是,在 C++ 中没有虚拟模板函数这样的东西(这是我相信你在解析你的问题后试图完成的)。
我能想到的最接近、最不丑陋的解决方案是让基classB
中的虚函数将基classA
作为一个参数:
class B
{
public:
virtual void f(A& a) = 0;
};
B1
覆盖它,然后使用 dynamic_cast
将其参数转换为 A1
.
的实例
以这种方式,您可以继续定义每个 Ax
和 Bx
派生的 class 对,而无需更改基础中的 API 接口class,在两个层级之间。
有点难看,但问题表明 "any C++ feature can be used",并且 dynamic_cast
当然符合该要求。
比如我有一个抽象基classA
和B
。 A
有一个虚方法如下
class A
{
public:
virutal void f(B& b) = 0;
};
对于class A1
class A1 : public A
{
public:
void f(B& b) override { b.f(A1); }
};
因此对于B
,它需要一个虚拟方法f(A1)
class B
{
public:
virtual void f(A1& a) = 0;
};
而在class B1 : public B
中实现了虚方法。问题是,当添加另一个 class A2 : public A
时,我必须在 class B
中添加一个虚拟方法 virtual void f(A2& a) = 0
,我认为这破坏了代码,因为我没有知道我设计class B
的时候加不加A2
甚至A1
。如何避免它但执行等效要求?任何 C++ 功能都可以与模板一起使用。
不幸的是,在 C++ 中没有虚拟模板函数这样的东西(这是我相信你在解析你的问题后试图完成的)。
我能想到的最接近、最不丑陋的解决方案是让基classB
中的虚函数将基classA
作为一个参数:
class B
{
public:
virtual void f(A& a) = 0;
};
B1
覆盖它,然后使用 dynamic_cast
将其参数转换为 A1
.
以这种方式,您可以继续定义每个 Ax
和 Bx
派生的 class 对,而无需更改基础中的 API 接口class,在两个层级之间。
有点难看,但问题表明 "any C++ feature can be used",并且 dynamic_cast
当然符合该要求。