10.在现实当中,很少人需要直接去操纵对象的内部实现,举个例子,很少有人需要直接操纵我的胃,因为那样他们可能很容易一不小心就干错事. 至多他们只会通过我的公用接口去间接地操纵我的内部,这种做法的好处是他们在进行操作之前必须首先让我知道并得到我的认可才行,例如递给我一瓶标有"喝掉我"字样的液体,那么我可以决定是喝了它,还是用它来洗头或洗车,根据自己的感觉和判断. 当然,有些人的确有资格直接操作我的"内部",例如外科医生,只不过即使如此: a. 这种情况也很少见 b. 我至少能够选择是否愿意接受手术 c. 我至少能够选择我高度信任的医生.以上是合法范围,否则就是强暴了,像reinterpret_cast那么粗鲁,是不会给人以好印象,也不会带来良好的结果
2 MathSlope:
从根本上来说,首先需要把一般概念中的public成员函数上升到interface的层次,这个感觉不是简单的define x y,而是typedef y x,而interface既然是public的,是提供给外部的操作接口,那么它的形态就必须是stable的,也就是说名字不能变,返回值和参数一个都不能变,而对于直接操作public/protected的成员变量,这就是高耦合性,这里把protected也算在内是因为未来谁会操作protected里的东西是不可知的,这同样意味着存在安全性的问题;同样如果直接操作public/protected的虚函数,因为virtual是多态的,其设计目的是针对其派生类的实现行为,表现是不稳定的,当需求发现变化(比如在函数实际调用前要增加一段检查),这时它就无法实现而最后还是必须退回使用一个non-virtual public的接口如Render,其中会调用一个virtual的private成员函数如DoRender来实现,请注意前面两者的称呼一个叫接口另一个叫成员函数. 当然,书中也提到是"尽量"而不是"必须",这也是C++的特点,你几乎不用受到什么限制,没有谁说你非要这样做,不这样就不行.