本系列內容爲《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;