【发布时间】:2016-09-09 05:57:47
【问题描述】:
给定一些基本接口 A、B、C.... N
还有一些实现它们的假设类:
class MyClass1: public A, public B, public N;
class MyClass2: public A, public B, public D;
我想创建一个函数,它接受一个对象(或指向对象的指针)作为参数,该类包括 A 和 B。
void myFunc( A&B obj );
从 C++ 程序员的角度来看,这似乎很荒谬。从软件架构师的角度来看,这似乎是所有语言都应该具备的基本块。
有什么技巧(除了模板)或解决方案吗?
注意:大部分接口不是来自我,所以(原则上)不可能对接口进行更改。
编辑: 这里有一些例子:
class A{
public:
virtual void draw()=0;
};
class B{
public:
virtual void edit()=0;
};
class AandB: public A, public B
{
virtual void draw()override{};
virtual void edit()override{};
};
//This function know about A, B, but not AandB
void some_function((A+B)& a_and_b) { // That do not work
a_and_b.draw();
a_and_b.edit();
}
int main()
{
AandB c;
some_function(c); // that is not so easy
}
【问题讨论】:
-
在我看来
MyClass继承A和B的事实与问题无关。A和B是不相关的类型,所以真正的问题是如何编写一个可以接受两种不相关类型之一的函数。 -
@Galik:这就是接口的重点:定义一些行为。 A 是一种行为(可绘制?),B 是另一种行为(可编辑?)。因此该函数接受任何可编辑和可绘制的类。所以你的问题的答案是:不是 A 或 B,而是 A 和 B。
-
嗯,好的。所以你想接受任何同时实现
A和B的类。模板其实就是解决这个问题的方法,你为什么不想要一个模板解决方案呢? -
我不喜欢模板,因为它是非常强大但不安全的功能之一 1)强制定义在标题中,难以维护 2)难以使用多态指针管理,3)它与其他语言的更好特性,如多态性、重载函数等。 4)它使一些其他特性(如虚拟)变得困难或不可能? 5) 代码难以检查,因为问题仅在使用阶段很明显。笼统地说:模板是用于一般编程的,IMO 不应该被用作代码重用、继承限制和“一切”的小丑。
-
嗯,好的。这很有趣,因为在继承和模板方面,我的感觉大多与你相反。 ;o)
标签: c++ c++11 interface polymorphism code-reuse