基于MATLAB的面向对象编程(1)——类,属性,方法
這里寫目錄標題
- 1 入門
- 1.1 如何把面條抽象成Class
- 1.2 文件類
- 2 基于MATLAB的面向對象編程入門
- 2.1 如何定義一個類(Class)
- 2.2 創建一個對象
- 2.3 類的屬性
- 2.3.1 如何訪問對象的屬性
- 2.3.2 默認屬性值
- 2.4 類的方法
- 2.4.1 定義類的方法
- 2.4.2 調用類的方法
- 2.5 類的構造函數
- 2.6 類的繼承
- 多態(Polymorphism)
- 2.7 類之間的基本關系:繼承、組合和聚集
- 2.8 Handle類的set和get方法
- 2.9 類的屬性和方法的訪問權限
- 2.10 clear classes
- 2.11 對象根據類定義的改變自動更新
1 入門
1.1 如何把面條抽象成Class
以面條為例。
classdef Noodle < handlepropertiestypestateendmethodsfunction boil(obj)obj.state = 'done';endend end其中Noodle是類的名稱,type和state是類的property,類的屬性,也可以稱作成員變量。
將其類定義的保存名為Noodle.m,與類同名。
調用類的方法
1.2 文件類
classdef FileClass < handlepropertiesnamepathformatdatafIDendmethodsfunction obj = FileClass(name,path)obj.name = name;obj.path = path;obj.open();obj.read();endfunction open(obj)fullpath = strcat(obj.path,filesep,obj.name);obj.fID = fopen(fullpath);endfunction read(obj)obj.data = textscan(obj.fID,'%s %s %s'); %假定數據文件為兩列endfunction delete(obj)fclose(obj.fID);disp('file closed');endend end所有的屬性和操作均為public,可以直接訪問文件的數據屬性。
fileobj = FileClass(filename,path); a = fileobj.data;%賦值給a面向對象編程的優點:
2 基于MATLAB的面向對象編程入門
2.1 如何定義一個類(Class)
MATLAB可以通過whos檢查變量所屬的類。
用戶可以設計自己的類。
- MATLAB的所有Class均以classdef開始
- classdef后緊跟類名,
- <handle 是MATLAB的抽象類,做父類
如簡單的二維點類定義如下
classdef Point2D<handleproperties %屬性xy%...endmethods %方法function obj = Point2D(x0,y0)%...obj.x = x0;obj.y = y0;endfunction normalize(obj)r = sqrt(obj.x^2+obj.y^2);obj.x =obj.x/r;obj.y =obj.y/r;endend end表示二維坐標軸上的點,具有x,y坐標屬性作為其屬性,
methods定義了兩個方法,一個是*(Constructor)構造方法* ;一個是其他的使用函數。其類的成員方法和普通函數區別不大。
2.2 創建一個對象
p1 = Point2D(1.2,1.0); p2 = Point2D(2.0,5.0);屬性可以是double標量,矩陣甚至是GUI對象。
2.3 類的屬性
2.3.1 如何訪問對象的屬性
p1 = Point2D(1.2,1.0); p1.x p1.x = 10; p1.x通過Dot運算符實現
2.3.2 默認屬性值
classdef Point2D<handleproperties %屬性x = 0.2;y = 0.3;%...end支持MATLAB表達式,最好使用固定值。也可以在Constructor中對成員變量進行初始化。
同時是屬性可以實現一些特定屬性。
properties(Constant)不可修改。
可以聲明成dependent(非獨立)屬性,其值可以動態改變
classdef Point2D<handleproperties %屬性x = 0.2;y = 0.3;endproperties(Dependent)rendmethods %方法function obj = Point2D(x0,y0)%...obj.x = x0;obj.y = y0;endfunction r = get.r(obj) %計算公式需要放在get方法中。r = sqrt(obj.x^2+obj.y^2);endfunction normalize(obj)obj.x =obj.x/obj.r;obj.y =obj.y/obj.r;endend end- 隱藏屬性
查看對象信息,不被顯示。
同理可以在成員方法中使用。
2.4 類的方法
2.4.1 定義類的方法
function作為關鍵詞。
方法較多,可以將方法單獨放一個文件。
但需要創建一個獨立文件夾
2.4.2 調用類的方法
點調用和函數調用形式:
obj.memberFunction(arg1,arg2) 等價于 memberFunction(obj,arg1,arg2)
最好使用點調用。
- 方法的簽名
obj必須作為方法的參數,是其對所有對象均能作用,同時作為在MATLAB中唯一性方法的簽名(signature),不同類下的同一命名的函數可以同時使用。
2.5 類的構造函數
一個類僅有一個構造函數(Constructor)。
其函數有且只能有一個返回值,且必須是新的對象。
-
構造函數中可以給屬性賦值。
-
通過nargin使構造函數接收不同參數的輸入。
-
默認構造函數(Default Constructor:不帶任何參數的構造函數。
-
不創建構造函數,MATLAB會給一個默認值。不接受任何參數。
2.6 類的繼承
繼承是OOP中最重要的概念之一。
假設兩個獨立的類,二維點和三維點的類。
分別定義如下
-二維點類定義
classdef Point2D<handleproperties %屬性x y endmethods %方法function obj = Point2D(x0,y0)obj.x = x0;obj.y = y0;endfunction print(obj)disp(['x = ',num2str(obj.x)]);disp(['y = ',num2str(obj.y)]);endend end- 三維點類定義
重新定義三維點類,代碼重復率較高,冗余,構造函數也相似,print函數也相似。
故可以從二維點類繼承到三維點類。
通過繼承方式從二維點類創建三維點類。
其中Point2D為父類(Parent Class)Point3D為子類。
p3 = Point3D(); isa(p3,'Point2D')值為1,因為三維點是二維點的一種。
子類的構造函數需要先調用父類的Constructor。
-子類中如何調用父類同名方法
相同函數foo,子類對父類的方法進行了擴展。
多態(Polymorphism)
同樣的方法被不同的對象調用產生不同的形態。如上三維點類和二維點類的print函數。
2.7 類之間的基本關系:繼承、組合和聚集
- B可不可以繼承A,要看其是否擁有A的屬性和方法。例:企鵝和鳥的類區別。
- 類的組合(Composition):多個類的組合,而不是多個類的多重繼承。
- 組合的聚集關系(Aggregation)
2.8 Handle類的set和get方法
- set方法給對象屬性賦值
在命令行給a負值,則會報錯
>> obj = A(); >> obj.a = -10 錯誤使用 A/set.a (line 10) a must be positive外部賦值,會調用set函數 ;內部則不會,但在properties部分設置默認值時需要驗證set的有效性。
一個屬性的set方法盡量不要訪問其他屬性,(Order Dependency),若需要則將其屬性設置為Dependent。
- get方法
將程序變得向后兼容。
% % classdef Record < handle % % properties % % date % % end % % end% 將其名字改的更有意義 % 改為timeStamp classdef Record< handleproperties(Dependent,Hidden)dateendpropertiestimeStamp %新屬性endmethodsfunction set.date(obj,val)obj.timeStamp = val;endfunction val = get.date(obj)val = obj.timeStamp;endend end在不修改外部程序情況下實現對新類的定義 。
但set和get方法耗時較長,避免如下的無意義的set和get 定義
2.9 類的屬性和方法的訪問權限
- public,protected,private
控制類公開的內容,避免不必要內容。
根據關鍵詞“Access= private,protected,public”進行聲明屬性和方法的可訪問性。 - private
表示僅該類的成員方法可以訪問此數據。 - protected
表示僅該類和其子類可以訪問此數據 - public
均可見
屬性的訪問權限可以細分為SetAccess和GetAccess
問題:私有成員數據子類不可見,是不能繼承?
舉例:訪問權限設置-銀行賬戶
- 更加細化的控制訪問權限
通過Access中指定類名實現。
(Account = {?BankManager})
類似與C++的friend關鍵詞,但此僅針對一個屬性或方法進行實現。
2.10 clear classes
- clear obj
清除對象 - clear classes
2.11 對象根據類定義的改變自動更新
不需要clear classes
R2014b版之后
《MATLAB面向對象編程-從入門到設計模式(第2版)》
總結
以上是生活随笔為你收集整理的基于MATLAB的面向对象编程(1)——类,属性,方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MATLAB编程规范
- 下一篇: 基于MATLAB的面对对象编程(3)——