多封装,少开放。强烈建议C++标准增加class之间的注入机制

来源:互联网 发布:apache禁止访问根目录 编辑:程序博客网 时间:2024/06/05 02:54

近日在修改了一下下引擎代码(为了自己的组件),发现有些接口是只有特定类及其内部函数才去访问,却不使用友元声明的形式进行数据访问——当然使用了普通非virtual的形式也就是意味着不建议重载。

故此:

1、建议派生类(或允许)重载的声明为虚函数即virtual类型,

2、强制派生类实现的声明为纯虚函数

3、不希望派生类重载或覆盖的函数则为普通类,如果访问群体有限定范围或者范围比较少,可以考虑增加友元+protected的方式进行访问控制,从而实现有效设计信息传达。但是有的时候我们不能保证可能需要访问的友元,或者说另外的类不是我们设计的,就会出现开篇提到的现象。鉴于这种情况,我觉得C++应该增加一个注入机制,在编译期间允许其他类去访问另外的类的protected函数,而不是仅仅通过继承。也许说友元已经足够了,但是友元的局限太明显了。 

机制实现细节如下:

regAble class A

{

protected:

void visit;

//something else

};


class B:reg A

{

A * p;

void visit()

{

p->visit();

}

}


4、如果某个操作允许重写,最好使用virtual的形式,即便丧失了小部分性能,但是还是可以原先多样化的操作。这样子和3产生强烈的对比,减少代码设计相干,减少思维耦合



下面这段是一段非常优秀的代码:

/**     * Sets the arrival order when this node has a same ZOrder with other children.     *     * A node which called addChild subsequently will take a larger arrival order,     * If two children have the same Z order, the child with larger arrival order will be drawn later.     *     * @warning This method is used internally for localZOrder sorting, don't change this manually     *     * @param orderOfArrival   The arrival order.     */    void setOrderOfArrival(int orderOfArrival);

当我看到这样的注释,我立即明白自己是否需要处理改接口。


0 0
原创粉丝点击