中国开发网: 论坛: 程序员情感CBD: 贴子 776127
xyzero: 遇到一个问题求一个可能的设计模式或者实现方法。
我需要定义一个Interface,双向的。(对C++来说,可应该是两个Interface,都是抽象类,比如一个叫CBaseUser,另一个叫CBaseProvider。)
User模块可以使用这个Provider Interface。(相当于有一个指向实现者的指针,CBaseProvider*)
同时需要实现User Interface。(相当于继承了/实现了CBaseUser。)
Provider则正相反。它有一个指向CBaseUser的指针,并继承/实现了CBaseProvider。

但是这里有个问题。在C++中,从抽象界面继承下来的类,必须用Virtual Method Table动态绑定。这个性能损失是我不能接受的。

我尝试了用模板方法。有这样一种pattern用于静态多态。并大量使用在早期的一些模板类中,称为Curiously Recurring Template Pattern。在这个pattern下,可以静态call到继承者。示例如下:

template <class Derived>
struct base
{
void interface()
{
// ...
static_cast<Derived*>(this)->implementation();
// ...
}
};

struct derived : base<derived>
{
void implementation();
};

~~~~~~~~~~~~~~~~~~~~~~~~~

但是这个做法在双向的时候遇到问题。因为两个类,互相使用对方的类型作为template的参数是不成的,循环依赖了;而且这个template形式上比较恶心;同时,一个模块可能会同时use几个interface,也可能会同时提供几个interface,甚至其中某个interface会同时提供多个副本。我晕了。这种component-model下怎么处理interface没经验。

不是必须用C++,C也成。用不用类都成,struct指针也成。我找了一堆95年前后的编程资料,这种设计模式基本上只在那个年代比较多,追求存储和效率的极致。

我觉得本质上是如何能用一个通用类型,在编译时访问到专用类型。有点儿象宏,但是宏不能解决多个副本问题,无论是compiler-time还是run-time。
人生的目的只有两件事:第一,得到你想要的;第二,得到之后就去享受它。
但是只有最聪明的人才能做到第二点。

我的话很重要,你们一定要反复理解,直到弄不明白为止!

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录