日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于MATLAB的面向对象编程(1)——类,属性,方法

發布時間:2025/4/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于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,與類同名。
調用類的方法

noodle = Noodle(); %調用構造函數的創建對象obj。 noodle.boil(); %調用成員方法boil,noodle屬性改變。

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檢查變量所屬的類。
    用戶可以設計自己的類。

    classdef Point2D<handleproperties %屬性%...endmethods %方法%...end end
    • 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中對成員變量進行初始化。
    同時是屬性可以實現一些特定屬性。

  • 常量(Constant)
    properties(Constant)不可修改。
  • 非獨立屬性
  • classdef Point2D<handleproperties %屬性x = 0.2;y = 0.3;r%受x和y屬性的影響。endmethods %方法function obj = Point2D(x0,y0)%...obj.x = x0;obj.y = y0;obj.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

    可以聲明成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
    • 隱藏屬性
    properties(Hidden)

    查看對象信息,不被顯示。
    同理可以在成員方法中使用。

    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
    • 三維點類定義
    classdef Point3D<handleproperties %屬性x y zendmethods %方法function obj = Point3D(x0,y0,z0)obj.x = x0;obj.y = y0;obj.z = z0;endfunction print(obj)disp(['x = ',num2str(obj.x)]);disp(['y = ',num2str(obj.y)]);disp(['z = ',num2str(obj.z)]);endend end

    重新定義三維點類,代碼重復率較高,冗余,構造函數也相似,print函數也相似。
    故可以從二維點類繼承到三維點類。
    通過繼承方式從二維點類創建三維點類。

    classdef Point3D<Point2Dproperties %屬性zendmethods %方法function obj = Point3D(x0,y0,z0)obj = obj@Point2D(x0,y0);obj.z = z0;endfunction print(obj)print@Point2D(obj);disp(['z = ',num2str(obj.z)]);endend end

    其中Point2D為父類(Parent Class)Point3D為子類。

    p3 = Point3D(); isa(p3,'Point2D')

    值為1,因為三維點是二維點的一種。
    子類的構造函數需要先調用父類的Constructor。

    -子類中如何調用父類同名方法

    相同函數foo,子類對父類的方法進行了擴展。

    多態(Polymorphism)

    同樣的方法被不同的對象調用產生不同的形態。如上三維點類和二維點類的print函數。

    2.7 類之間的基本關系:繼承、組合和聚集

    • B可不可以繼承A,要看其是否擁有A的屬性和方法。例:企鵝和鳥的類區別。
    • 類的組合(Composition):多個類的組合,而不是多個類的多重繼承。
    classdef Head<handlepropertieseyenosemouthearendmethodsfunction obj = Head()obj.eye = Eye();obj.nose = Nose();obj.mouth = Mouth();obj.ear = Ear();endend end %避免使用如下 多重繼承 classdef Head<Eye&Nose&Mouth&Ear%.. end
    • 組合的聚集關系(Aggregation)

    2.8 Handle類的set和get方法

    • set方法給對象屬性賦值
    classdef A < handlepropertiesaendmethodsfunction set.a(obj,val)if val > 0obj.a = val;elseerror('a must be positive');endendend end

    在命令行給a負值,則會報錯

    >> obj = A(); >> obj.a = -10 錯誤使用 A/set.a (line 10) a must be positive

    外部賦值,會調用set函數 ;內部則不會,但在properties部分設置默認值時需要驗證set的有效性。
    一個屬性的set方法盡量不要訪問其他屬性,(Order Dependency),若需要則將其屬性設置為Dependent。

    • get方法
    function val = get.b(obj)val = obj.b;disp('getter called');end

    將程序變得向后兼容。

    % % 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 定義

    classdef A < handlepropertiesvarendmethodsfunction set.var(obj,var)obj.var = var;endfunction var = get.var(obj)var = obj.var;endend end

    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)——类,属性,方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。