开发区域

先进的软件开发与MATLAB

广度钻石

有时候,Java®让我很烦。

不要误解我的意思,在很多方面,它都是一种美丽的语言,充满了优雅的结构和所有您需要的工具,以帮助驱动健壮的体系结构。然而,另一方面,这种结构和严格的规则集增加了复杂性,需要平凡的、无趣的、充满激情的“锅炉板”代码来完成您想要的接口,同时实现代码重用,以保持您的生产效率。

另一方面,有时候c++让我害怕。

C ++是更接近金属,并且允许你拍自己的脚,如果你不能背诵C ++标准逐字的每一段或准确地知道每个编译器实现了标准。这是梦幻般的,让您完全访问和完全控制作为一和零的比特流如何跳舞对硬件,同时毁灭性当这些同样的一和零和好如初吧。

一个有趣的案例研究,比较了这些方法是(在)著名死亡的钻石问题多重继承。C ++金宝app支持多重继承,它是在遇到它的时候非常危险,由于默认的C ++语义。看看下面简单的菱形结构:

默认情况下,创建的底层c++对象实际上会产生两个实例一种如下面看到的那样,一个用于通过继承每个路径。这可能会导致痛苦的世界,在运行时铸造的对象是不可预见的和意想不到的方式切片时尤其如此。当有两个真理什么A是你也可以看到你是如何进入不一致的状态,在那里,如果你通过指针通过指针到C你是更改属性B和访问该属性实际设置和访问该属性的两个不同副本!

现在,随着我们学习更多的c++避免这种模棱两可的方法,但总的来说,我认为这是一个公平的要求,在C使用多重继承++是一种先进的机动,可以是充满了危险,你最好知道你是完全彻底做,以避免陷入一些危险的陷阱什么.对产生的培养一直避免多重继承,主要是由于钻石问题的这一行为。

事实上,这个问题对Java和c#等语言的设计产生了直接影响,这些语言特别禁止属性和方法的多重继承。当然,您可以实现许多接口,但这些接口不能有实现(是的,在Java 8中现在有接口的默认方法,但它们不能包含任何用于这些方法操作的属性)。其结果是大量的模板代码,其中Java对象实现了接口,但需要硬编码接口实现与跨许多对象共享的某些实现的链接。这个锅炉板代码有时让我热血沸腾!好吧,我没那么生气,但听起来不错。我确实认为这种不能从两个基类中继承内容的情况导致了比真正需要的代码多得多的代码,对我来说,代码是一种负担。

这个问题归结为缺乏语言功能。死亡继承结构的金刚石不屑主要是由于棘手/危险语言语义C ++,但是当我们的语言正在操作手柄更安全的许多原因,以避免它消失。MATLAB例如在处理更加合理和易于理解的方式多重继承。遇到金刚石结构不那么严重在C这样做++有时甚至可以是完全正常。例如,仅存在共同的基类的单个实例(一种以上)和方法模糊度被捕获并防止。

最后,我经常发现,在讨论这个问题时,许多人将多重继承视为一种味道,不惜一切代价避免使用钻石结构。然而,当我们开始探究它们为什么这样做时,很难找到一个独立于特定语言(如c++)的答案。

我不提倡匆忙地在代码中添加一堆菱形结构!事实上,它经常表明可能存在抽象问题,而且有一些微妙之处(例如,共享基类只有一个实例,但MATLAB调用它的构造函数两次)。然而,在MATLAB中,它更易于管理,最终熟悉了菱形问题使您可以使用mixins。mixins的使用是一种强大的设计策略,它利用了多重继承,是一种替代作品这同样帮助保持宽层次结构.我们下次再讨论这些。

你觉得呢?我漏掉什么了吗?你能帮助描述超越语言语义的钻石问题的基本问题吗?你有没有遇到过在MATLAB中有意或无意的钻石,如果有,它有什么影响?




发布时间与MATLAB®R2015a

|

评论

要发表评论,请点击在这里在您的帐户MathWorks公司签署或创建一个新的。