开发区域

先进与MATLAB软件开发

组成自己

最后一次我们有一个小讨论的优点保持继承层次浅,避免创建深,多层次结构。这都是十全十美的,但实际上我们如何达到这个目的?毕竟,许多人敏锐地意识到干燥的原理是否按名称或只是直觉。我们不喜欢写两次相同的代码。大多数程序员有敏锐厌恶臭名昭著的复制/粘贴操作,实现shortsighted-ness的使用。

因此继承救援!…对吧?不一定。继承似乎可以构建代码重用,但事实上它不是。它是建立抽象。它是建立多态性。它允许协作构建代码运行在基类的接口能够操作更具体的接口实现。建立不重用代码,但允许基类的接口供其他代码。

那么我们如何实现代码重用我们的欲望吗?保持冷静,经典的方法是支持组成。这意味着我们重用的代码而不是继承,但通过抓住将父类的子类。

思考天体像过去后,一种方法可以实现如下:

首先我们包括基类:

classdefCelestialBody属性质量结束结束

为了在这类结构,包括圆形的行为让包括RoundedBody不包含实现类。

classdefRoundedBody属性(抽象)半径结束结束

RoundedBody是纯粹的抽象,我们显然是不包括在我们的产业结构为代码重用的目的和我们的目的更明确。

好,现在让我们开始创建一些实现:

classdef属性半径结束结束

这里我们有一个类,给出了实现我们需要的和不想重装。而且这门课可能与天体和更集中在几何、原始形状,等等。这类天体甚至可能居住在我们的应用程序和图形库。这是好消息,因为形状库是一个核心库,专门用于重用和广阔的应用不仅仅是天体建模。它将处理形状最著名的方法操作,并战斗测试和边界情况证明。这是我们应该使用。

…和we use it through composition:

classdef星< CelestialBody & RoundedBody属性(依赖)半径结束属性(访问=私人)SphereDelegate =球;结束方法函数半径= get.Radius(明星)= star.SphereDelegate.Radius半径;结束函数明星= set.Radius star.SphereDelegate(明星,半径)。半径=半径;结束函数辐射(明星)结束结束结束

正如您可以看到的明星现在展览RoundedBody行为与实现。重要的是要注意依赖属性的使用。效率和可维护性的原因,我们只希望有一个事实,什么是半径。依赖属性允许这个因为没有存储分配给他们,但他们仍然像属性从用户的观点。当用户访问或修改它们,分别MATLAB分派到getter或setter。这类似于getProperty和setProperty方法在传统的面向对象语言(如c++或Java®因为c++ / Java风格的调用get / set方法包装不知道任何关于实现。调用者不知道getter只是访问实例的分配属性,是否计算在每一次飞行,还是使用一个合作者,因为我们已经在那里了。在这种情况下,setter和getter委托给私人SphereDelegate财产。的用户明星是不知道的,但我们允许代码重用的吗代码。这个操作使用依赖属性的MATLAB与编写c++或Java风格设置/获取方法是非常重要的,因为它允许强大的MATLAB索引和矢量化属性的操作。

这里有一些更多的天体模型类的方法:

classdef< CelestialBody & RoundedBody的星球属性卫星结束属性(依赖)半径结束属性(访问=私人)SphereDelegate =球;结束方法函数半径= get.Radius(地球)= planet.SphereDelegate.Radius半径;结束函数地球= set.Radius planet.SphereDelegate(地球半径)。半径=半径;结束结束结束classdef月亮< CelestialBody & RoundedBody属性HostPlanet结束属性(依赖)半径结束属性(访问=私人)SphereDelegate =球;结束方法函数半径= get.Radius(月球)= moon.SphereDelegate.Radius半径;结束函数月亮= set.Radius moon.SphereDelegate(月亮,半径)。半径=半径;结束结束结束classdef小行星< CelestialBody属性形状结束结束

这些类在一起形成以下结构:

正如你所看到的这个方法会导致更多的锅炉板代码。执行这个代表团从代码编写的角度来看并不完全是免费的,但你必须编写额外的代码是简单的和不可能包含错误。

不过,我们这里的一个关键好处是能够单独的接口的代码我们希望分享我们希望为自己的声明。在我们的例子中,即使这些类有精确的相同的功能,他们没有可替换的!代码在这些天体无法运营,通过设计,在任何操作在这个世界上,包括篮球西红柿。同样,这些对象不能使用在其他环境中操作球体而不是仅限于设计领域中。事实上甚至明确从球体接口的类图不是连接到CelestialBody层次结构。组合是一种宽松得多的耦合比继承。虽然我们仍然能够重用所需的代码,我们不要让这些天体圆与其他软件模块交互的方式设计和理解。

你对这种方法的想法是什么?你介意锅炉板,以换取作文提供的自由和灵活性?




发表与MATLAB®R2015a

|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。