Generic design | 多重继承在设计组合上的失败以及Templates带来的曙光

注意:本系列博文需要对templates和STL有一定掌握。

 多重继承在设计组合上的失败以及Templates带来的曙光

       关于多继承与设计组合,很容易导致一种想法:多重继承可能有助于处理【设计组合】--------通过使用少量的选择后的base classes,便可制作出同时具有多种特性以及能力的物件。因为多继承能让继承者同时拥有多个被继承者的特性与能力,以及其他可能的更多特性。但是,任何一位有经验的classes设计者都知道,这样天真的设计方式其实无法正常运作。

       让我们来分析多重继承的失败原因,这有助于我们产生更富有弹性的设计,也能为健全的设计方案提供一些参考的想法。使用多重继承机制来组合多想功能或物件特性,将会产生以下问题:

      1.关于技术。目前领域,并不会存在一成不变即可在某种受控的情况下将继承而来的classes组合起来的程式码。唯一可组合的,只有工具语言所提供的【多重继承】的机制:也就是仅仅将被组合的base classes组合在一起并建立起一组用来存取其内部成员的简单规则。除非情况极其纯粹,否则结果难以让人轻易接受。大多数时候你需要小心协调继承而来的classes的运作,确保它们的行为。 

     2.关于型别资讯。Based classes并没有足够的型别资讯来继续完成他们的工作。试想象一下,你目前正试着藉由一个DeepCopy class来为你的程序实作出深度拷贝能力。但DeepCopy应该具有怎样的介面呢?当然,必须产生一个物件,却其型别未知。 

     3.关于状态处理。base classes实作出的各种行为必须操作相同的state。这也就意味着它们必须虚拟继承一个持有该state的base class。由于总是会由user classes去继承library classes,这会使设计更加复杂并变得更没有弹性可言。

    虽然本质上是组合,但多重继承无法单纯解决设计时的多样选择性问题,然而templates却在这方面却十分有趣。

    templates 是一个很适合【组合多种行为】的机制,主要是因为它们是“一来使用者的型别资讯”且在编译期才会产生的程式码。

    和一般的class 不同的class templates 可以使用不同的方式订做。如果你需要针对特定情况来设计的class,那么你可以在你的class templates仲特化其内部成员来改变订制因子。试想一下:如果有一个smartprt<T>,你可以针对smartprt<T>特化成其任何成员。这样会让你得到何种好处?那就是会为你在设计特定行为时提供非常良好的【粒度】。

    对于拥有多个参数的class templates,你完全可以采用偏特化,它可以让你根据部分参数来特化一个class templates。例如,以下为一个class templates 的定义:

template <class T,class T1> class SmartPrt { ... };

    你可以令其对Widget及其他任意型别偏特化,定义如下:

template <class T1> class SmartPrt<Widget ,T1> { ... };

     由于template 的编译期特性以及【互相组合】的特性,让其相当引人注目。然而,程式撰写者一旦开始尝试实作出这样的设计,那么其将会遭遇的,可不是一些那么浅白的问题了:

     1. 无法特化结构。单单使用templates ,你无法特化 class 结构,只能特化其内部成员。

     2. 内部成员的特化不能“按语义扩张”,你可以对单一的template 参数的class templat 特化其内部成员,却无法对多template 参数的class template 特化其内部成员,例如:

template <class T>class Widget
{
    void Do() { ... };
}
//这是可以的
template <> void Widget<char>::Do(){ ... }
template <class T ,class T1> class Widget
{    
    void Do() { ... };
}
//这是不可以的,因为member function 的Explicit specialization 没有partial specialization机制
template <class T1> void Widget<char ,T1>::Do() { ... }

     3. 程式库撰写者不能够提供多个预定值,理想的情况下,class template 的实作者可以对每一个成员提供一份预设作品,但不能对同一个成员提供多份预设作品。

    纵观多重继承与templates 之间的优缺点比较,两者居然有趣的互补。多重继承欠缺技术,templates 有丰富的技术。多重继承缺乏型别资讯,而templates里却大量存在。templates 的特化无法扩张,多重继承却很是容易。你只能为templates内部成员写一份预设版本,但却可以写无限个base classes。

   根据以上分析,如果将两者组合起来,那么将会产生很富有弹性的Device,这应该很适合用来生产程式库中的【设计元素】。





  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值