01
定義類
1.1 一個最簡單的類
使用classdef ... end語句塊來標識一段類的定義,這一點和MATLAB其他代碼塊的語法風格是類似的,如定義函數的function ... end、定義循環的for ... end等等。要注意類定義文件的文件名要保持和類名一致,否則MATLAB在運行時會按照類定義文件名作為可被識別的標識符。
如下面這個示例中,定義了Student類,以及它的屬性和方法。這個實例展示了定義類的最簡單的方法,MATLAB還提供了很多高級的類特性定義方法,接下來的章節會逐一介紹。
1.2 類文件組織
對于一個簡單類來說,所有的方法實現可以放在同一個類文件中。但是隨著類實現的功能逐漸龐大,就可以把某一個類方法的實現單獨放在一個類方法文件中,和類定義文件一起放在以<@類名>的類文件夾下。同時,通過把類文件或者普通函數文件放在以<+包名>的包文件夾下,可以讓類有獨立的名稱空間。使用包文件夾中的類或者函數時,必須加入包名和點操作符修飾(包括包內的類在使用包中其他類時也要使用包名修飾,不會因為在同一個包內就能搜索到)。
02
類屬性
2.1 屬性特性
通過屬性特性來約束屬性的行為,語法是在屬性關鍵字之后添加小括號括起的鍵值對。常用的屬性特性有Access、Constant、GetAccess、SetAccess等。當用戶不指定屬性特性時,它們有各自的默認值,如Access默認就是public。
2.2 屬性驗證
MATLAB是一種弱類型的語言,一般情況下MATLAB會做自動類型推斷。MATLAB提供了很多方式來驗證屬性滿足用戶的某種需求,如必須是string類型、必須滿足一定的維度要求、必須大于某一數值等。這些都是通過類的屬性驗證語法來實現的。
這里額外提一下屬性驗證函數,除了自帶的一些屬性驗證函數(如mustBePositive、mustBeGreaterThan、mustBeNumeric)等,還允許用戶自定義屬性驗證函數,這些屬性驗證函數放在和類定義的語句之后。
03
類方法
3.1 方法調用
和C++不同的是,MATLAB沒有傳遞給類方法的隱藏類對象,如this指針,必須將類的對象顯式傳遞給方法。對于普通方法,通常第一個參數用于傳遞類對象,也通常寫作obj。這一點和python的__init__(self, ...)很像。調用方法時,可以使用函數式或者點操作符,這里我認為函數式調用方法是MATLAB的特色。函數式調用方法時,會涉及到對象匹配的優先級判定,因為不同的對象可能會存在同名的方法,由MATLAB的內部機制決定執行哪個類對象的方法。
** 3.2 方法特性**
和屬性特性一樣,也可以對方法指定不同的特性。常用的特性參數如Access、Static。這里特別提一下Static參數,當Static = true時,方法為靜態方法,不需要使用類對象的任何屬性參數。靜態方法通常作為實現類的功能函數存在。類似的函數還有類相關函數,即放在同文件下,類定義之后的局部函數。
注意這里grow方法返回了對象本身,這是因為如果修改了類對象的屬性,需要返回對象本身才能體現修改。猜測這是因為MATLAB的函數是按值傳遞的特性造成的,因此修改對象后必須返回對象的副本。如果對象繼承自handle類,那么可以避免這一步,handle類是按引用傳遞的。
3.3 函數重載
重載 MATLAB 函數的方法是定義一個與要重載的函數同名的類方法。在類實例中調用該函數時,MATLAB 會調度該類方法。還可以通過用適當的名稱定義類方法來重載 MATLAB 算術、邏輯、關系和索引運算符。這些運算符有對應的特殊函數名,如運算符 + 對應的內建函數就是plus。
3.4 構造函數
構造函數是一種特殊的類方法,和類同名,且必須放在類定義文件中,不可以放在單獨的文件中。可以在構造函數中使用其他函數一起完成構造。
3.5 創造對象數組
MATLAB類對象支持定義數組特性。在C++中,需要定義一個對象數組來保存各個對象的指針,但是MATLAB類對象本身就支持多維特性。通過在構造時指定對象的維度,可以返回多維的對象數組。
這里需要注意的是,使用obj(m, n) = obj的語法時,已經改變了對象的維度屬性,因此必須返回新的obj對象,哪怕繼承了handle類。這一點在構造函數使用了其他輔助函數時特別容易忽視和犯錯。
04
總結
MATLAB面向對象編程為組織大型工程提供了基礎,同時它的OOP特性和其他語言也有所不同
-
MATLAB仿真
+關注
關注
4文章
176瀏覽量
19922 -
C++語言
+關注
關注
0文章
147瀏覽量
6989 -
python
+關注
關注
56文章
4792瀏覽量
84627
發布評論請先 登錄
相關推薦
評論