C++编程批判系列 担当的本质[VC/C++编程]
本文“C++编程批判系列 担当的本质[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Eiffel和C++都供应了多担当的机制.但Java却没有,因为它认为多担当会招致很多问题的呈现.不过Java供应了接口(interface)作为一种替换机制,它近似于Objective C中的协议(protocol).Sun声称接口可以供应多担当所能供应的全部特点.
Sun所声称的“多担当会带来很多的问题”这个概念是对的,特别是在C++顶用以实现多担当的办法更能阐明这一点.那些看起来仿佛利用多担当会比单担当更简单的来由,目前都以被证明是毫无意义.比方,若何制订关于从两个类之上担当得到的具有相同名字的数据项之间的战略?它们之间能否兼容?假如是的话,那他们能否应当被归并成为一个实体?假如不兼容,那应当若何辨别它们?……这样的列表可以列出很长很长.
Java的接口机制也可以用以实现多担当,但它也有一个很重要的差别之处(与C++相比):担当中的接口必须是抽象的.由于利用接口并没有任何的实作,这就消除了需求从差别实作之间挑选的大概.Java答应在接口中声明具有常数字段.当需求多担当时,他们就归并成为一个实体,这样也就不会招致歧义的产生.但是,当这些常数具有差别的值时,又有什么会发生呢?
由于Java不支持多担当,我们就不可以像在C++和Eiffel中那样利用混合(mixin)了.混合是一种特点,它可以把从差别的类中得到的差别的非抽象的函数放到一同形成一个新的复杂的类.比方,我们大概但愿从差别的源代码中导入一些utility函数.但是,我们也可以通过利用组合而不是担当来到达一样的效果,因此,这也就不会对Java构成一个重要的攻击了.
Eiffel在办理多担当问题时并没有导入一个单独的接口机制.
有些人大概认为,相关于多担当来说,单担当更文雅一些.这是一个很分外的概念.
BETA [Madsen 93]就属于认为“多担当不文雅”的那一种:“Beta中没有多担当,这主如果因为(关于多担当)贫乏一个深化的理论上的理解,并且当前的(关于多担当的)倡议在技术上看来也非常复杂”.他们引用了Flavors(一种可以将类混合在一同的语言)为证据.与Madsen相比,Flavors中的多担当与其次序有关,也就是说,担当自(A,B)和担当自(B,A)是不一样的.
Ada95是另一种不支持多担当的语言.Ada95支持单担当,并把它叫做标志范例扩大(tagged type extension).
别的一些人认为,关于某些特别模子下的问题,多担当可以供应文雅的解法,因此为之付出的勤奋也是值得的.固然上面所列出的关于多担当的问题列表并不完善,它仍旧显示:与多担当相关的问题是可以被系统地辨识出来的,而一旦问题被确认,它们也便可以被文雅地办理.当[Sakkinen 92]关于多担当研究到达一个很深的程度后,它就得出了上述定义.
Eiffel中采取的办法是,多担当会引发一些风趣的且有挑衅性的问题,然后再文雅地办理它们.程序员所需做的全部决意都被限制在类的担当子句中.它包含利用renaming来保证众多从担当中得来的同名特点终究成为具有差别名字的特点,关于担当而来的特点所施展的新的export战略:redefining和undefining,以及用来消除歧义的select.在全部的情形下,编译器城市为我们做好这一切,为了使得语义清楚而不管是挑选利用fork或是join,程序员都具有完好的掌握权.
C++中相对Eiffel来说有着别的一种差别的用于消除歧义的机制.在Eiffel中,在renames子句中,特点间必须有着差别的名字.在C++中,可以利用域解析操作符’::’来辨别成员.Eiffel的做法好处在于,歧义在声明中就被消撤除了.Eiffel的担当子句相对C++的来说要复杂不少,但它的代码也显得更简单,更安定,并更具弹性.这也就是声明办法与操作符办法相比的好处所在.在C++中,每次当我们碰到在多个成员间具有歧义时,我们必须在代码中利用域解析操作符.这经使得代码变得混乱不堪,影响其延展性,假若有其他地方的改变会影响歧义时,我们大概就需求在歧义大概呈现的每个地方改变已有的代码.
按照[Stroustrup 94]中12.8节所说,ANSI委员会考虑过利用renaming,但是这个提议被委员会中的一个成员所阻塞掉了,他保持让委员会中的其他成员用两周时间来好好地考虑这个问题.在12.8节中给出的例子显示了在没有显示的renaming的前提下,若何做可以得到一样的效果.问题在于,假如这都需求那些专家们利用两周来考虑若何实现,那留给我们的空间又有多少呢?
域解析操作符并不只是被用来消除多担当所带来的歧义.由于计划杰出的语言可以避免歧义的呈现,因此域解析操作符也就是一个丑陋的,加深复杂性的实作伎俩.
在C++中,“若何来声明多担当中的父类们”是一个很复杂的问题.它影响到了建构函数被调用的次序,当程序员确切想从子类转到父类时也会招致问题的呈现.但是,我们也可以把这个称为不好的程序计划气势.
C++和Eiffel的另一个差别之处在于直接的反复担当,Eiffel中答应:
class B inherit A, A end 但
class B : public A, public A { };
却不被C++承认.
以上是“C++编程批判系列 担当的本质[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |