本系列内容为《MATLAB面向对象编程–从入门到设计模式》学习笔记,特此说明。
面向对象的程序设计关键是对类的设计。
本文内容为类之间的基本关系:继承、组合和聚集。
如何判断B能够继承A
若在逻辑上,B时A的“一种”(a kind of,isa),则允许B继承A的功能和属性。A是基类,B继承了A,B继承了A的成员变量和成员方法。
使用“继承”可以提高程序的复用性,但是如果只是为了增加程序的复用性而盲目地使用继承,那么就会造成逻辑上的混乱和程序适用性的降低,因此为了防止乱用“继承”,使用时应遵循:
如果类A和类B不相关,则不能为了使B的功能更多而让B继承A的功能和属性。
类的组合
如果在逻辑上A是B的“一部分”(a part of),则不要为了让B得到A的功能而去继承A,而是要用A和其他类组合出B。
e.g. 眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,因此类Head应该由Eye、Nose、Mouth、Ear组合而成,而不是派生而成。
classdef Nose < handle
%.....
end
classdef Eye < handle
%.....
end
classdef Mouth < handle
%.....
end
classdef Ear < handle
%.....
end
classdef Head < handle
properties %头由 眼、鼻、口、耳组成
eye %成员变量是对象
nose
mouth
ear
end
methods
function obj = Head()
obj.eye = Eye();
obj.nose = Nose();
obj.mouth = Mouth();
obj.ear = Ear();
end
end
end
对应的,使用继承方式为:
classdef Head < Eye & Nose & Mouth & Ear % 符号 & 表示多种继承
%.....
end
不使用继承的原因:
Head 是由Nose、Mouth等组成,他们之间没有严格的isa关系,不能让Head得到Nose、Mouth等的功能而使用继承。
在MATLAB程序中,组合关系要求Head对象一定在内部拥有Nose等对象,这是通过Head对象的构造函数保证的。
function obj = Head()
obj.eye = Eye();
obj.nose = Nose();
obj.mouth = Mouth();
obj.ear = Ear();
end
这将保证在Head对象被创建时,其余4个对象也同时被创建。
组合聚集关系
组合关系
组合(Composition)是一种强烈依赖的整体和部分关系。
e.g. 前面提到的头是有眼、鼻、口、耳组成。
聚集关系
聚集(Aggregation)是一种松散的整体和部分关系。整体和部分并不是强烈的依赖,即使整体不存在了,部分任然可以存在。
e.g. 自行车(Bike)由架子、轮子(Wheel)和坐垫(Seat)等部分组成。即使自行车架子不存在了,轮子等依然可以存在。
聚集反映在程序上,Wheel和Seat的对象可以独立创建(而不需要再Bike的构造函数中被创建)。创建完成之后,再装到自行车架子上。
classdef Bike < handle
properties
frontWheel
rearWheel
seat
end
end
%--------------------------------------------
frontWheelObj = Wheel();
rearWheelObj = Wheel();
seatObj = seat();
........
bikeObj = Bike();
bikeObj.frontWheel = frontWheelObj; %聚集关系
bikeObj.rearWheel = rearWheelObj;
bikeObj.seat = seatObj;