笔盒box:不止是收纳,更是你灵感的孵化器

核心内容摘要

当爱意遇上生活:解锁“男人女人在一起愁愁愁”背后的情感密码
探索“血腥网站”的地下世界:黑暗、欲望与真相的交织

抖动指尖,乐享无限:91抖淫,重塑你的娱乐新视界

lostmouse翻译和往常一样我又在为一个按说应该很简单的设计问题大伤脑筋。

可能是劳工节假期刚过还没来得及收心吧我感觉自己有点迷迷糊糊的。

Wendy刚开始休产假我的靠山也没了。

其实任务只不过是要在一个工程中引入一个新类而已。

我已经有一个类它和想要引入的这个类非常相近。

问题是我不知道该在现有的类和新类之间建立什么关系。

当然不能让新类从现有类公有继承因为二者之间没有IS-A(是一个)的关系。

Layering(分层)也不行因为我需要重写一些虚函数。

剩下的选择只有二者取一要么采用私有继承模拟Is-Implemented-In-Terms-Of(用...来实现)的关系要么干脆提取它们的共同功能设计一个新的基类。

百思不得其解之际我想大虾此时还不出现更待何时我让转椅飞快地转了一圈----可是四周一个人也没有。

我感到自己有点搞笑于是还是回到电脑前。

那好吧 我自言自语怎么也得自己搞掂。

有时不是那么容易搞掂的哟。

我吓了一跳分明是大虾轻柔的声音在我耳旁响起。

我抬起头大虾正盯着我呢。

她继续慢悠悠地问道你准备怎么搞掂啊我正在为这犯愁呢 我只得承认同时心跳开始平静下来。

Scott Meyers的第40条款中说对于一个现有的但概念上不相关的另一个类如果想利用它的代码可以采用Is-Implemented-In-Terms-Of的关系来实现[注1]。

他举的一个例子是用List来实现Set。

我把代码给大虾看templateclass Tclass Set {private:ListT rep; // representation for a setpublic:// ...};但第43条款建议 我继续说如果两个类享有共同的代码它们就得从一个基类继承。

他的例子是两个CartoonCharacter类即Cricket和Grasshopper它们都从一个新引入的共同基类Insect继承。

我把第二个例子给大虾看class CartoonCharacter { /* ... */ };class Insect : public CartoonCharacter { /* ... / };class Grasshopper : public Insect { /* ... / };class Cricket : public Insect { /* ... */ };大虾不禁婉然一笑是的。

但43条款只适用于两个有关系的类啊。

真是个菜鸟 怎么忘了这一点呢我不禁小声骂了自己一句。

这回记住了我的菜鸟 她点点头补充了一句。

现在四周一定有人听得见我们说话面子还是得保住。

你说得对。

但是 于是我反击道我的困惑在于我可以将条款43的方法用到条款40的例子中。

也就是说不用List来实现Set相反为什么不创建一个新类比如Container作为Set和List的基类呢拿我现在的这个工程来说吧我完全可以为新类和已有的类设计一个公共基类。

哦我明白了 大虾点点头你的问题实质上是怎么区分条款40所说的 利用现有类的代码和条款43所说的 共享一部分代码。

表面看来二者确实很相似。

大虾停下来思考了片刻我想你应该按这种思路来考虑通常来说当要向一个工程添加一个新类并且已经有一个很相似的类存在时一般有三种选择让一个类从另一个类继承创建一个公共基类让新类和现有的类从它继承用一个类来实现另一个类。

最简单的当然是第一种情况----它们之间是IS-A的关系吗如果是就让新类从现有的类公有继承否则就不行。

哦对了 我一边在笔记上奋笔疾书一边插话这就是Meyers所说的关于C必须牢记的一点。

不过这次不是1066 [注2]大虾白了我一眼继续说分析一下所谓的共享或公共代码的本质吧假如你有现有类的代码的话如果没有代码很明显就不能改变现有类你只能运用Is-Implemented-In-Terms-Of。

但现在这个工程中你有它的代码你就得分析一下它们真的可以共用吗也就是说每个类真的会调用同一个函数吗----这不是指仅仅名字相同的函数而是真正相同的函数。

在Meyers的那个例子中Cricket和Grasshopper都调用相同的singCustomization函数。

它们是真正公用的代码。

相反如果你引入一个新的Container基类它的insert函数对Set和List来说不一定都可以工作。

它们中的某个类甚至两个类就都得重写自己的insert函数。

这种情况下代码不是真正公共的使用公共基类就不好。

继续分析上面的现有类和新类。

从概念上来说它们和某个你认为有用的基类有关系吗你希望你的Container类怎样有用拿标准容器类做例子吧从来就没有什么叫作std::container的类并且也不可能有----为什么唔 我支唔了一声试探道因为接口不相同这一条理由就足够了。

她让我过了关。

它们的接口不同而且共同性是由特定的使用场合决定的而不是特定的函数名。

仅仅因为想把两个不相关的类联系起来就去捣鼓出一个基类这有点荒谬相反这种情况下应该运用Is-Implemented-In-Terms-Of。

等一下 我插了一句。

Insect类不就是用来联系其它两个类的吗是的但Cricket类和Grasshopper类本来就有联系----它们归根到底是在CartoonCharacter的基础上派生出来的。

另外Insect类提供了其它一些功能Cricket和Grasshopper都要构筑在这些功能之上。

所以Insect类是很有意义的一个类。

它提供了一种紧密的、一致的的抽象。

还要注意 她继续说如果你想访问现有类的保护成员可能就要考虑使用非公有继承。

最后问问自己使用Is-Implemented-In-Terms-Of会带来多继承吗要知道使用公共基类就没有这个问题。

多继承天生就比单继承复杂能用简单的方法为什么不用呢我感觉自己有点似懂非懂看来再听下去就要晕菜了。

那好吧谢谢你的帮助。

我想我现在知道自己该怎么解决了哦是吗大虾歪了一下脑袋对了早晨我听Wendy的丈夫说...怎么样 我一下兴奋起来。

一位千金七斤多星期一早晨2:18出生的名叫Jeannine Nancy。

[注1] Scott Meyers. Effective C, 2nd Edition, Items 40, 42, and 43 (Addison-Wesley,

.[注2] Scott Meyers. Effective C, 2nd Edition, Item 35 (Addison-Wesley,

.

xg0058Cm-xg0058Cm最新版N.20.13.78-2265安卓网应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123