




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、MATLAB面向對象程序設計 第1章 緒言 1.1如何學會一門編程語言 1.2做筆記的方法 1.1如何學會一門編程語言 1.一本好書或一套好的視頻:體系完整、講解生動、知識準確 2.一本好的練習冊:能夠得到充分的鍛煉,內化知識 3.一段比較孤獨的時間:不受干擾、深入學習、突破枯燥期 4.留下筆記或電子文檔 1.2做筆記的方法 1.抓主干:瀏覽章節(jié),把定義、格式和注意事項標出。 2.讀范例:仔細看解釋部分和example,理解內容。 3.記錄:把主干部分記錄下來,用作提醒和助記。 4.練習:練習這一章節(jié)的內容 5.豐富:根據(jù)練習結果添加意義、范例和說明 第2章 MATLAB基礎知識 MATLAB
2、的help文檔 MATLAB的help文檔是學習MATLAB的重要工具之一。MATLAB的help文 檔有規(guī)則定義、解釋說明和范例,很多問題可以在help文檔里找到答案。 Matlab運算符 1. 算術運算符 算術運算因所處理的對象不同,分為矩陣和數(shù)組算術運算兩類。 2. 關系運算符 需要明確指出的是,MATLAB 的關系運算雖可看成矩陣的關系運算,但 嚴格地講,把關系運算定義在數(shù)組基礎之上更為合理。關系運算是元素 一對一的運算結果。 3. 邏輯運算符 為提高運算速度,MATLAB 還定義了針對標量的先決與和先決或運算。 先決與運算是當該運算符的左邊為1(真)時,才繼續(xù)與該符號右邊的量做 邏輯
3、運算。先決或運算是當運算符的左邊為1(真)時,就不需要繼續(xù)與該 符號右邊的量做邏輯運算,而立即得出該邏輯運算結果為1(真);否則, 就要繼續(xù)與該符號右邊的量運算。 4. 運算符的優(yōu)先級 和其他高級語言一樣,當用多個運算符和運算量寫出一個MATLAB 表 達式時,運算符的優(yōu)先次序是一個必須明確的問題。 MATLAB中的全局變量 全局內存是指內存的一種特殊類型,它能夠被所有的工作區(qū)訪問。如果一個變量在函 數(shù)中被聲明全局變量,那么它將占用的是全局內存,而不是本地工作區(qū)。 如果相同的變量在另一個函數(shù)中被聲明為全局變量,那么這個變量所占有內存區(qū)域就 是第一個函數(shù)中的相同變量。 最好把全局變量聲明在函數(shù)的
4、開頭,這樣可以區(qū)別于本地變量。 在一個程序,你能利用全局內存,在函數(shù)之間對大規(guī)模數(shù)據(jù)進行交換。 如果想讓某個函數(shù)中定義的變量能夠被其他函數(shù)調用,需要用到全局變 量。注意,在這兩個函數(shù)中都要用global修飾這個變量。如: function t1 global x; x=0; function t2 global x; y=x end 1.6.2圖形窗口及坐標軸 hf=figure(Color,0.5,0.5,0.5,Position,200,200,500,400); ah=axes(Parent,hf,Color,0.8,0.8,0.8); x=-2:.2:2; y=-4:.4:4; x,y
5、=meshgrid(x,y); z=x.*exp(-x.2-y.2); h=surf(Parent,ah,x,y,z,FaceColor,flat,EdgeColor,b); MATLAB面向對象程序簡介 1)類 在MATLAB中,將類視作定義有特定行為的新的數(shù)據(jù)類型,與普通 的類型數(shù)據(jù)不同,類是一組具有共同特性對象的抽象,不僅包含數(shù)據(jù), 還包含了對數(shù)據(jù)的操作。對特定類的對象所定義的操作,稱為該類的方 法。也可以將類看作可作為單獨實體對待的新項目。 MATLAB中類的相關概念如下: 類定義描述一個類中所有實例的共有特征 屬性對類實例的數(shù)據(jù)存儲 方法特殊函數(shù),通常是在類實例中的操作 事件消息,當
6、發(fā)生一些特定的行為時由類定義和提供的類實例的廣 播。 特性值,修改屬性、事件、方法和類的狀態(tài)。 聽眾對象,當事件通知廣播時,對特定的事件作出響應。 對象類的實例 包文件夾,一個類定義和函數(shù)命名的集合。 2)對象 MATLAB中的對象是類的一個實例,這個實例包含實際數(shù)據(jù)所代表的特 定實體。對象并不是被動的數(shù)據(jù)容器,對象還積極管理數(shù)據(jù),包括只 允許特定的操作、數(shù)據(jù)隱藏、禁止外部用戶非法對數(shù)據(jù)的濫用等,對 象對其控制直到其消失。 MATLAB中類的設計、定義 1.類的設計 在MATLAB在,通常一個類可以分為兩個組成部分,即成員變量和成員 函數(shù)。在類的設計過程中,就是要從眾多實例中抽象出共同特征,形
7、成 類。 1)定義類數(shù)據(jù) 2)定義類操作 3)定義類事件 2.類的定義 MATLAB類的定義由關鍵詞、屬性成員、方法和事件4個部分組成。 Classdef類名 Properties 屬性 end methods 方法 end event 事件 end end 第3章 MATLAB中的類和對象 3.1類的聲明 3.2類的屬性成員及訪問控制 3.3類的方法及訪問控制 3.4類的組合 3.1類的聲明 3.1.1類的聲明 3.1.2對象的創(chuàng)建和使用 3.1.3類的特性 3.1.4類定義的組織形式 3.1.5命名空間和包 3.1.1類的聲明 要在MATLAB中聲明一個類,可以采用兩種方式:其一是聲明為v
8、alue型 類(值型類),其二是聲明為handle型類(句柄型類)。 使用value型類對象可以用來表示一個實體數(shù)據(jù),用該類型對象復制另一 對象時,則其中一個對象數(shù)據(jù)的修改不會引起另一對象的改變,這是又 有它們所占用的不是同一個存儲空間,因此它們在數(shù)據(jù)上是相互獨立的。 在MATLAB中聲明一個value型類的一般格式如下: Classdef類名 Properties 屬性 end methods 方法 end event 事件 end enumeration 枚舉(輸入?yún)?shù)) end end 3.1.2對象的創(chuàng)建和使用 MATLAB面向對象程序設計中創(chuàng)建一個對象的過程一般是通過調用類的 構造函
9、數(shù)來實現(xiàn)的,其格式如下: 對象名=類的構造函數(shù)(輸入?yún)?shù)) 訪問對象成員采用的是點(.)操作符,其一般形式是: 對象名.類成員 3.1.3類的特性 3.1.4類的組織形式 3.2類的屬性成員及訪問控制 3.2.1屬性成員的聲明和初始化 3.2.2屬性成員的特性 3.2.3屬性成員的get和set方法 3.2.4屬性成員的訪問控制 3.2.1屬性成員的聲明和初始化 一個類的普通數(shù)據(jù)成員,我們可以安排在類的屬性成員部分,屬性成員塊中的 成員可以按如下格式定義: Properties 屬性成員1; 屬性成員2; end 屬性成員的初始化可以通過兩種途徑來完成。第一種是在屬性成員塊內 為數(shù)據(jù)成員指定初
10、始值。 第二種初始化屬性成員的方法是用構造函數(shù)來完成的,構造函數(shù)的返回 值一般都是一個對象,通過引用對象中的屬性成員將形參賦值給它們。 3.2.2屬性成員的特性 3.2.3屬性成員的get和set方法 如果在創(chuàng)建好對象后,要改變屬性成員的值,對于具有公有訪問特性的 屬性成員來說,可以直接通過對象來訪問該成員,從而重新設置其值。 這說明MATLAB對一個類對象的屬性成員具有進行設置(set)和查詢 (get)功能。屬性成員的get和set方法就是用來設置這種功能的。 如果沒有編寫屬性成員的set和get方法,訪問對象的屬性成員時就會直 接操作。 如果編寫屬了性成員的set和get方法,訪問對象的
11、屬性成員時MATLAB 就會調用相應的set和get方法,而不會再直接操作。 Set方法的格式: function obj=pertyName(obj,value); End Value就像一個匣子,裝入訪問對象時傳入 的值,供set函數(shù)內部進行相應的操作。 如obj. propertyName=10;則MATLAB會令 value=10。 get方法的格式: function value=pertyname(obj) end 同樣地,這里的value也是一個形參,代表查詢屬性成員時,MATLAB 要提供的值。 如 pertyName %假設get函數(shù)
12、使value=10; ans= 10 3.2.4 屬性成員的訪問控制 3.3類的方法及其訪問控制 3.3.1普通方法及其訪問控制 3.3.2構造函數(shù) 3.3.3靜態(tài)方法 3.3.4類型轉換方法 3.3.1普通方法及其訪問控制 普通方法的聲明方式一般有兩種:第一種是在類塊中給出完整的函數(shù)定 義;第二種方式是在一個單獨分文件中給出函數(shù)的完整定義,而在類中 只給出函數(shù)的聲明形式。 在類塊中給出完整的函數(shù)定義 例子: Classdef Myclass Properties x=1.0; end methods function obj=Myclass(val)%構造函數(shù) obj.x=val; end
13、function y=computeadd(obj,val) y=obj.x+val; end end 格式如下: Methods function val1=fun1(obj,args1) end function val2=fun2(obj,args2) end function fun3(obj) end end 調用方法時有如下兩種形式: obj.fun1(args1)和fun1(obj,args1) 例如:T=myclass(5); computeadd(4); computeadd(T,4); 3.3.2構造函數(shù) 構造函數(shù)是類中的一個特殊方法,MATLAB中構造函數(shù)的主要作用是來
14、完成對象的創(chuàng)建工作,與此同時可以對對象中的數(shù)據(jù)進行初始化。 構造函數(shù)也是類的一個方法,除了具有一般成員方法的特征之外,還具 有一些特殊的性質: 1)構造函數(shù)的函數(shù)名與類名相同。 2)構造函數(shù)只能返回一個參數(shù),它是本類的一個對象,在類的所有方 法中只能用構造函數(shù)來創(chuàng)建一個對象。 3)構造函數(shù)總是返回一個有效的類實例,而不是一個空對象。 4)如果類中沒有說明構造函數(shù),則MATLAB就會提供一個無輸入?yún)?shù) 的構造函數(shù)(默認構造函數(shù)),并返回一個標量對象,該對象中的屬性 成員或被初始化為空 (),或按默認值初始化。 3.3.3靜態(tài)方法 3.3.4類型轉換方法 3.4類的組合 3.4.1內嵌對象 3.4
15、.2類的優(yōu)先級問題 3.4.3對象的保存與加載 3.4.1內嵌對象 實際上,類的屬性成員中也可以存放另一個類的實例。由此我們可 以利用已有的類的實例來構建新的復雜的類。 如果一個類中的某屬性成員存放的是另一個類的對象,我們在這里 將這樣的成員成為內嵌對象。 3.4.2類的優(yōu)先級問題 1)不同類之間包含同名函數(shù)時的優(yōu)先級問題 可以通過設置類的優(yōu)先級來確定主導類。MATLAB中確定類之間的優(yōu)先級是通過設置 一個類的inferiorClass特性來實現(xiàn)的,其格式如下: classdef(InferiorClass=?class1,?class2,myClass End 這表明class1、class
16、2等的優(yōu)先級要低于myClass,即myClass相對于它們是主導類。如 果沒有指定類的優(yōu)先級,那么在默認情況下,在調用這些類的那個同名函數(shù)時,輸入 參數(shù)最左邊的對象是主導對象 2)同名類之間的優(yōu)先級問題 3.4.3對象的保存與加載 像MATLAB的普通變量一樣可以用命令save將工作空間的對象保存在mat 文件中;當這個對象從工作空間刪除后,這個對象可以從保存文件中用 命令load加載到工作空間中來。 Save和load的使用格式是: save filename object Load filename object 第4章 MATLAB中的繼承與派生 4.1類的繼承與派生 4.2派生類的構
17、造函數(shù) 4.3多重繼承的成員標識問題 4.4指定容許派生的類 4.5類成員的訪問控制 4.6定義MATLAB內置類型的派生類 4.1 類的繼承與派生 4.1.1繼承與派生的概念 4.1.2派生類的定義 4.1.3派生形成過程 4.1.4用派生類創(chuàng)建一個類的別名 4.1.1繼承與派生的概念 MATLAB中通過派生(class derivation)的機制來支持繼承。被繼承的類 型被稱為基類(base class)或超類(superclass),而新產(chǎn)生的類則為 派生類(derived class)或子類(subclass)。 4.1.2派生類的定義 MATLAB中,派生類的一般定義格式為: Cl
18、assdef 派生類名基類名1%后面部分可看成基類1的構造 對象名=對象名基類名1(參數(shù)表1);%函數(shù) 對象名=對象名基類名1(參數(shù)表1); 對象名.新增屬性成員1=參數(shù)1; 對象名.新增屬性成員M=參數(shù)M; end 使用派生類構造函數(shù)的注意事項 1.如果在調用派生類的構造函數(shù)時,需要將參數(shù)傳給基類成員,則在 派生類構造函數(shù)中要顯式地調用這些基類的構造函數(shù),否則MATLAB 會隱式調用。 2.如果在派生類構造函數(shù)中要顯式地調用基類構造函數(shù),則這樣的調 用應在創(chuàng)建的對象引用之前來完成。 3.一個派生類也可以不編寫構造函數(shù),除非它的基類的構造函數(shù)是帶 輸入?yún)?shù)的。 4.2.2派生類構造函數(shù)執(zhí)行的順
19、序 繼承順序 Class C(子 類) Class B Class A(基 類) 調用順序 調用Class C的構造函數(shù) 調用Class B的構造函數(shù) 調用Class A的構造函數(shù) 4.3多重繼承中的成員標識問題 4.3.1屬性成員名稱沖突 4.3.2方法名稱沖突 4.3.3事件名稱沖突 在MATLAB面向對象程序設計中,多重繼承一般不支持各個基類中帶有 同名成員,但在一些特殊條件下允許出現(xiàn)同名成員。 4.4指定容許派生的類 4.5類成員的訪問控制 4.5.1屬性成員的訪問控制 4.5.2方法的訪問控制 4.5.3事件的訪問控制 4.6定義MATLAB內置類型的派生控制 4.6.1MATLAB
20、的內置類 4.6.2定義MATLAB內置類的派生類 第5章 handle類型 5.1handle類型的聲明 5.2類handle的介紹 5.3屬性成員get/set接口的實現(xiàn) 5.4動態(tài)屬性成員的實現(xiàn) 5.5handle類型的析構函數(shù) 5.6handle兼容類 5.7深拷貝與淺拷貝 有時我們希望給對象創(chuàng)建一個引用,而不希望復制這個對象的數(shù)據(jù),這 時就可以使用handle型類了。 5.1handle類型的聲明 Handle型類聲明形式與value型類聲明形式的根本不同之處是前者必須是 類handle的派生類,而后者不是。類handle是MATLAB中已聲明的一個抽 象類。 聲明一個handle型
21、類的格式是: Classdef 類名handle end Handle型類的派生類也是handle型類。這時,我們不需要在handle型派生類 中再次將handle指明為基類。 聲明了一個handle型類之后就可以創(chuàng)建handle型類對象了,handle型類的對 象簡稱為handle對象。創(chuàng)建handle對象形式和value型類是相同的,不同的是: 創(chuàng)建handle對象時,構造函數(shù)返回的不是被創(chuàng)建的對象,而是這個對象的句 柄。MATLAB中的一個句柄也是一個變量,它是一個類實例的唯一標識。當 我們復制一個句柄對象時,MATLAB復制的是句柄,不會復制這個對象中的 數(shù)據(jù)。這個被復制的句柄引用的數(shù)
22、據(jù)與原來的句柄引用的數(shù)據(jù)是一致的。 除自定義的handle型類外,MATLAB中的句柄圖形(handle graphics)類型的 行為特征也類似于handle型類。MATLAB在創(chuàng)建每個圖形對象時都為對象分 配唯一的一個值,稱為圖形對象句柄(handle)。句柄是圖形對象的唯一標 識符。句柄圖形型類創(chuàng)建的對象就是MATLAB的圖形對象,句柄圖形型類創(chuàng) 建一個對象時返回一個已創(chuàng)建對象的句柄。 Handle型類可以通過句柄復制來實現(xiàn)對象的引用功能,除此之外, handle類型還具有如下一些特征: (1).繼承類handle的方法; (2).能夠定義事件和聽眾; (3).定義動態(tài)屬性成員; (4)
23、實現(xiàn)句柄圖形類型的get和set方法。 5.2類handle的介紹 類handle是MATLAB內定義的一個抽象類。所謂抽象類就是只能作為基 類,而不能直接用它定義對象。類handle是定義所有handle型類的基類, 即要定義一個handle型類應該以類handle為基類,或以handle型類為基 類。 類handle中沒有提供屬性成員,而提供了許多有用的方法,定義一個 handle型類將繼承這些方法,這些方法的名稱和功能如下: 5.3屬性成員get/set接口的實現(xiàn) 在定義一些具有特殊要求的handle型類時,還可以用MATLAB中提供的兩個 handle型類作為基類。這兩個類分別是類hg
24、setget和類dynamicprops,前者提 供了set和get方法,使其能夠實現(xiàn)句柄圖形(handle graphics)類型的標準接口 風格,后者提供了能夠實現(xiàn)動態(tài)屬性成員的功能。這兩個handle型類也是抽象 類,不能直接定義對象。 MATLAB中標準的句柄圖形系統(tǒng)實現(xiàn)了基于set和get方法的一個接口(注:這 里的兩個方法有別于屬性成員中的set和get方法),利用這些方法我們可以設 置和查詢圖形對象的屬性值。Hgsetget類是handle的派生類,這個類實現(xiàn)這些 方法的實現(xiàn)過程。我們以hgsetget類為基類聲明的handle型類就可以繼承這些 功能,這樣的類就是一個set/g
25、et接口類。 與屬性成員的set和get方法調用方式不同,hesetget類的set/get接口方法 調用既可以按在對象上用操作符“.”引用屬性成員的方式進行設置和查 詢,也可以直接按普通函數(shù)的方式調用,如: V=get(h,PropertyName); 或 V=h.PropertyName; 這里v返回句柄對象h中成員PropertyName的值。 set(h,PropertyName,PropertyValue); 或 h.PropertyName=PropertyValue; 就是將句柄對象h中的成員PropertyName的值設置為PropertyValue。 5.4動態(tài)屬性成員的實現(xiàn)
26、 有時在使用這些同一個類的對象時,希望個別對象上附加上一些臨時的 數(shù)據(jù),這些數(shù)據(jù)有別于其他對象的屬性成員,而這些成員不用在類聲明 中提前給出,這些成員就是動態(tài)屬性成員。在MATLAB中可以通過類 dynamicprops的派生類來實現(xiàn)這種功能。 類dynamicprops是MATLAB內定義的handle型抽象類,它提供了能夠實 現(xiàn)動態(tài)屬性成員的功能。類dynamicprops除繼承類handle的所有方法外, 還增加了一個addprop方法,它的功能是向一個句柄對象添加一個屬性 成員的名稱,其使用格式如下: P=addprop(H,PropertyName) 這里P是meta.Dynamic
27、Property對象數(shù)組,H是一個句柄數(shù)組, PropertyName是要附加給這些對象的動態(tài)屬性成員名稱。 在對象上添加動態(tài)屬性成員時,動態(tài)屬性成員名稱除應遵循具有一般變 量的命名規(guī)則外,還應注意: 1).不能與這個類中的方法同名; 2).不能與這個類中的事件同名; 3).名稱中不能包含操作符“.”; 例如定義一個dynamicprops的派生類: classdef MyButton0 if length(pos)=4 obj.UiHandle=uicontrol(Position,pos,. Style,pushbutton); else error(Improper position)
28、end end end end end hbutton1=MyButton(20, 40, 100, 40);%創(chuàng)建對象 addprop(hbutton1,Caption);%添加動態(tài)屬性成員 hbutton1.Caption=OK;%給成員Caption賦值 set(hbutton1.UiHandle,string,hbutton1.Caption);%給定制的按鈕加標 題 在對一個對象上增加了動態(tài)屬性成員之后就可以像普通屬性成員一 樣來使用了: 1.可以通過對象用點操作符來設置和查詢該成員; 2.當保存和加載對象時,MATLAB也會把動態(tài)屬性成員進行保存和加 載。 3.可以為動態(tài)屬性成員定
29、義特性。 4.可以為動態(tài)屬性成員編寫set和get函數(shù); 5.可以聽到動態(tài)屬性成員引發(fā)的事件; 6.通過對象數(shù)組訪問動態(tài)屬性成員的值。 為這個動態(tài)屬性成員設置相應的特性,其方法是通過addprop返回值中 的meta.DynamicProperty對象來設置,如: p1=addprop(hbutton1,Caption);%添加動態(tài)屬性成員Caption hbutton1.Caption=OK;%給成員Caption賦值 p1.Constant=true;%設置成員Caption的特性 可以為動態(tài)屬性成員編寫自己的get和set函數(shù)。實現(xiàn)動態(tài)屬性成員的set和get 函數(shù)步驟是: 1.定義一個
30、函數(shù)來完成動態(tài)屬性成員進行設置和查詢之前希望完成的工作,其 格式為myset(obj,val)或val=myGet(obj); 2.獲得動態(tài)屬性成員對應的meta.DynamicProperty對象; 3.將我們定義好的動態(tài)屬性成員設置或查詢函數(shù)句柄指派到 meta.DynamicProperty對象的GetMethod或SetMethod成員上。我們定義的這個 函數(shù)不必是這個類的方法,這時我們不能用類似set.PropertyName這種形式的 函數(shù)名。 使用dynamicprops作為基類,我們就可以在該派生類對象上動態(tài)地添加 屬性成員。此外這些動態(tài)屬性成員還可以產(chǎn)生一些事件。 5.5ha
31、ndle型類的析構函數(shù) MATLAB創(chuàng)建一個對象是通過構造函數(shù)來實現(xiàn)的,當一個對象的生命周期即將 結束時,MATLAB會自動地去調用一個特殊的方法進行善后工作,這個特殊的 方法就是析構函數(shù)(destructor)。在handle型類中析構函數(shù)的主要特征是函數(shù) 名必須是delete,并以普通方法形式定義。除此之外,必須具備如下條件 MATLAB才會把delete方法當作一個有效的析構函數(shù): 1.delete方法必須有一個標量輸入,即本類對象; 2.不帶輸出參數(shù); 3.不能是密封的方法、靜態(tài)的方法或抽象方法,即方法的特性不能是Sealed, Static或Abstract。 聲明一個析構函數(shù)的方法
32、的一般格式: Methods function delete (obj) %析構函數(shù),obj是一個本類對象 end End 如果一個類的析構函數(shù)不必做其他工作,我們也不用在類中顯式 地重寫一個析構函數(shù),這是因為類handle中已定義了一個析構函數(shù) delete,因此這個析構函數(shù)也被繼承過來了。 5.6 handle-兼容類 Handle型類和value型類可以在同一場合下使用,這時就需要涉及到 handle型類與value型類的兼容性問題。 如果一個類可以和handle型類進行組合構成基類來創(chuàng)建派生類,則這樣 的類就稱為handle-兼容類。所有的handle型類都是handle兼容的。 Ha
33、ndle-兼容類遵循如下規(guī)則: 1.handle-兼容類的所有基類必須是handle-兼容類; 2.如果在一個類定義明確了HandleCompatible特性值為false,則該類 的所有基類中就不能有handle型類; 3.如果在一個類聲明沒有明確設置HandleCompatible特性,而有一個 基類是handle型類,則所有的基類都必須是handle-兼容的; 4.特性HandleCompatible不能被繼承。 Value型類、handle型類與handle-兼容類關系 圖 Handle型 類 Handle- 兼容類 Value型 類 繼承關系 Handle-兼 容類 Handle型
34、類 Value型 handle-兼 容類 基類: Handle型類 非handle兼 容類 派生類: 繼承于繼承于 一個handle兼容類表明它可以和handle型類進行組合構成基類來創(chuàng)建派生類。當 我們在定義抽象基類時,handle-兼容類提供了很大的靈活性,如在設計一個接 口類時,基類可以被設計成既支持handle型派生類,又支持value型派生類。 Handle-兼容類可達到一物兩用的效果。 在設計handle-兼容類的方法時,需要兼顧到傳參給方法的參數(shù)可能是handle型 對象也可能是value型對象。在調用時應考慮到會有兩種不同的行為: 1).如果是以handle型對象為方法的輸入?yún)?/p>
35、數(shù),則執(zhí)行方法會改變handle型對象, 這種改變對所有工作空間中的同名句柄都生效。 2).如果是以value型對象為方法的輸入?yún)?shù),則執(zhí)行方法僅會改變方法空間內 部的對象。 因此,如果handle-兼容類的一個方法既要操作handle型對象,又要操作value型 對象,則這個方法就應返回一個修改的對象。 5.7深拷貝與淺拷貝 5.7.1深拷貝與淺拷貝的概念 5.7.2MATLAB.mixin.copyable類簡介 5.7.3深拷貝的實現(xiàn) 5.7.1深拷貝與淺拷貝的概念 當a、b為value型類的對象時,將A復制給b后,改變對象B的屬性的值不 會對對象A的對應屬性的值產(chǎn)生影響。這種value
36、型對象的復制就叫做深 拷貝。 當a、b為handle型類的對象時,將A復制給b后,改變對象B的屬性的值 會對對象A的對應屬性的值產(chǎn)生影響,a、b在數(shù)據(jù)上不是完全獨立的兩 個單元。這種handle型對象的復制就叫做淺拷貝。 Handle型類對象之間進行復制時,一般是淺拷貝。那么這種對象之間能 否實現(xiàn)深拷貝呢? 5.7.2MATLAB.mixin.copyable類簡介 5.7.3 深拷貝的實現(xiàn) 第6章 對象陣列 6.1MATLAB中常用的陣列形式 6.2 創(chuàng)建對象陣列 6.3 不同類型對象組成的陣列 6.4多對象陣列 6.1MATLAB中常用的陣列形式 6.1MATLAB中常用的陣列形式 6.2
37、創(chuàng)建對象陣列 6.3不同類型對象組成對象陣列 6.4多對象陣列 6.1.1 陣列的概念 6.1.2 幾種常用的陣列 1.數(shù)值陣列 2.字符陣列 3.邏輯陣列 4.元胞陣列 5.結構體陣列 6.函數(shù)句柄陣列 單元陣列是matlab中特殊一種數(shù)組,它的元素被稱為單元(cells) ,它可以存 儲其它類型的 matlab數(shù)組。例如,一個單元陣列的一個單元可能包含一個實數(shù) 數(shù)組或字符型數(shù)組,還可能是復數(shù)組(圖7.1所示)在一個編程項目中,一個單 元陣列的每一個元素都是一個指針,指向其他的數(shù)據(jù)結構,而這些數(shù)據(jù)結構可 以是不同的數(shù)據(jù)類型。單元陣列為選擇問題信息提供極好的方示,因為所有信 息都聚集在一起,并
38、可以通邊一單個名字訪問。 單元陣列用大括號替代小括號來選擇和顯示單元的內容。 這個不同是由于單 元的內容用數(shù)據(jù)結構代替了內容。 假設一單元陣列如圖7.2所示。 元素a(1,1)是 數(shù)據(jù)結構33的數(shù)字數(shù)組。a(1,1)的含義為顯示這個單元的內容,它是一個數(shù)據(jù) 結構。 6.2 創(chuàng)建對象陣列 6.2.1如何創(chuàng)建對象陣列 6.2.2在對象陣列上添加動態(tài)屬性成員 陣列不僅可以由基本數(shù)據(jù)類型組成,也可以由類的多個實例構成。對象 陣列(object arrays)的元素是類的實例,不僅具有數(shù)據(jù)成員,還有操作 這些數(shù)據(jù)的方法。因此對象陣列具有一定的特殊之處。在MATLAB面向 對象程序設計中,一個對象陣列的所
39、有元素可以源自同類型的實例,也 可以不是。 6.2.1如何創(chuàng)建對象陣列 1)比較常用的方法是使用循環(huán)語句依次對陣列中每個元素用對象來初始化, 例如下面的循環(huán)語句創(chuàng)建了一個2*3對象陣列A: for i=1:2 for j=1:3 A(i,j)=Myclass(i+j); end end 這里Myclass是一個類。 2)用下標索賦值的方式,同時通過對陣列最后一個元素的賦值來創(chuàng)建對象陣列。例如我們聲明一個 類: classdef SimpleClass Properties Value end methods function obj=simpleClass(v) if nargin0 %支持無
40、參數(shù)輸入 obj.Value=val; end end end end 定義一個對象a: a=SimpleClass(6); 再用該對象初始化陣列的最后一個元素: A(2,3)=a; 這樣A就是一個2*3的對象陣列了,也可以直接通過調用SimpleClass的 構造函數(shù)來初始化陣列A,即: A(2,3)=SimpleClass(6) 此時對象陣列的沒一個對象都初始化了。而對象陣列A中的最后一個元 素是帶參數(shù)輸入的構造函數(shù)創(chuàng)建的對象,而其余元素是無參數(shù)輸入情況 下構造函數(shù)創(chuàng)建的對象。因此在這種方式創(chuàng)建對象陣列時,類構造函數(shù) 要支持無參數(shù)輸入的情況(即標*的語句),否則會提示錯誤。 3)在一個類的
41、構造函數(shù)實現(xiàn)部分構建對象陣 列。這時構造函數(shù)的返回值就是應是一個對 象陣列。例如,下面類的構造函數(shù)中就實現(xiàn) 了這種過程。 Classdef ArrayClass Properties Data; end methods function obj=ArrayClass(Matrix) if nargin=0; m,n=size(Matrix); obj(m,n)=ArrayClass;%預分配對象空間陣列 for i=1:m for j=1:n obj(I,j).Data=Maxtrix(i,j); End End End End End End 在上面類的構造函數(shù)中,首先為對象陣列的每個元素預
42、分配空間,在 這個過程中MATLAB首先對最后一個元素用左端的對象進行賦值,然后 依次用默認ArrayClass對象(無參數(shù)輸入情況下構建的對象)來填充, 從第一個元素到倒數(shù)第二個元素。預分配陣列對象之后,就為每個元 素對象的data依次用輸入矩陣matrix的對應元素賦值。 例如: M=magic(5);%創(chuàng)建5階魔方矩陣 c=ArrayClass(M)%創(chuàng)建5*5對象陣列 (4)通過空陣列來創(chuàng)建對象陣列。沒有元素的陣列就是一個空陣列, 但它有確定的類型。所有的非抽象類都具有一個靜態(tài)方法empty ,它的 任務是創(chuàng)建一個同類型的空陣列。Empty方法能夠使我們指定輸出陣列 的維數(shù),但必須要使
43、某一維為0,例如: E=SimpleClass.empty(4,0); 創(chuàng)建了一個4*0的SimpleClass型空陣列。當無輸入?yún)?shù)時,創(chuàng)建的0*0的 空陣列。如果我們給屬性成員賦值,則MATLAB會調用SimpleClass的構 造函數(shù)來擴展出一個指定大小的陣列: E(4,6).value=7 E E= 4x6SimpleClass Properties: value 這里擴展出了一個 4x6的對象陣列E。在這種情況下,MATLAB用 SimpleClass無參構造函數(shù)創(chuàng)建的對象來填充除第4行第6列以外的所有元 素。然后,MATLAB把數(shù)值7賦值到對象E(4,6)的屬性成員Value上。
44、如果一個對象陣列中的元素是由handle型對象構成的,則在初始化這些 對象時有些特殊之處。在用handle型對象擴展一個對象陣列時, MATLAB僅調用類的構造函數(shù)一次,然后為陣列中的每個元素創(chuàng)建唯一 的句柄,這時MATLAB不調用構造函數(shù),而從已創(chuàng)建的對象復制屬性成 員的值給其余的元素。 6.3 不同類型對象組成的陣列 6.4多對象陣列 第7章 多態(tài)性 7.1函數(shù)重載 7.2運載符重載 7.3抽象類 7.1函數(shù)重載 7.2運算符重載 7.3抽象類 第8章 事件與聽眾 8.1事件與聽眾的概念 8.2定義事件和聽眾 8.3屬性成員事件的收聽 8.4動態(tài)屬性成員事件響應 8.1事件和聽眾的概念 8
45、.1.1事件的概念及事件模型 8.1.2聽眾的概念 8.1.1事件的概念及事件模型 什么是事件呢? 事件的含義很廣泛。一般來說,從程序上可探測到的任何動作,都 能夠產(chǎn)生相應的事件,并可以將該事件的發(fā)生告知其他對象,來實現(xiàn)對象 之間的通信。這里的事件是用來標識發(fā)生的某件事情的。 在MATLAB面向對象程序設計中,事件表示發(fā)生在類實例(對象)中的 某些變化或行為,這些變化包括: (1)對類(對象)中的數(shù)據(jù)的修改; (2)方法的執(zhí)行; (3)查詢或設置一個屬性成員值; (4)析構一個對象。 在MATLAB中,事件驅動和事件響應過程構成了一個完整的事件模型。 組織一個事件模型的一般步驟如下。 (1)命
46、名事件:在一個handle型類中聲明一個標識符來代表事件,這個 類就是產(chǎn)生事件的類,簡稱事件類,相應的實例稱為事件對象; (2)創(chuàng)建聽眾:在一個類中聲明事件后,就可以關聯(lián)一個聽眾,一般用 addlistener函數(shù)來定義聽眾; (3)定義一個方法來確定何時觸發(fā)這個事件,并通過notify函數(shù)對聽眾 進行廣播來告之該事件的發(fā)生。 (4)定義回調函數(shù):當聽眾接受到某事件發(fā)生的信息時,就會去執(zhí)行 一個與之關聯(lián)的回調函數(shù),因此還要定義一個回調函數(shù)。 在定義聽眾時,既可以將該聽眾與產(chǎn)生事件的對象生命周期進行綁定, 也可以將其限制在聽眾對象的生存期和作用范圍內。 8.1.2聽眾的概念 在MATLAB中,聽
47、眾是用來接收事件發(fā)生消息的對象,是event.listener 型類的對象。在MATLAB面向對象程序設計中,定義一個聽眾可以采用 兩種方法:一種方法是使用handle類中的addlistener函數(shù);另一種方法 是直接調用event.listener類的構造函數(shù)。 一旦聽眾創(chuàng)建后,它會一直等待事件發(fā)生的消息,一旦關聯(lián)的事件發(fā)生 了,聽眾就會執(zhí)行一個回調函數(shù)。這里event.listener類是handle的子類。 Property(屬性成員)屬性成員)Purpose(意義)(意義) Source事件對象元胞數(shù)組 Event事件名 Callback事件觸發(fā)時執(zhí)行的回調函數(shù)(這時需要將特性 En
48、able設置為true Enabled是否執(zhí)行回調函數(shù)的開關(默認值為true) Recursive回調函數(shù)是否遞歸調用 8.2定義事件和聽眾 8.2.1如何命名一個事件 8.2.2事件觸發(fā)和廣播 8.2.3如何響應事件(聽眾的定義) 8.2.4聽眾的幾種創(chuàng)建方式 8.2.5回調函數(shù)定義和調用 8.2.1如何命名一個事件 在MATLAB面向對象程序設計中,一個事件要用一個名稱來標識。在一 個類的events事件塊中聲明一個標識符,便可定義該類中的一個事件的 標識,我們把這樣的標識也稱為事件,其格式如下: Classdef 類名handle events 事件名 end End 例如在下面Mcl
49、ock中定義了一個事件Alarm,我們可以通過改變成員Enable的值來觸發(fā)這 個事件。 Classdef Mclockhandle properties Enable=false;%是否啟動 end events Alarm %鬧鐘 end End 8.2.2事件觸發(fā)和廣播 當定義了事件的類中某些成員滿足一定條件時(屬性成員值被更新等), 我們就說這個事件觸發(fā)了或發(fā)生了。對于用戶自定義的事件(即除 preSet、PostSet、PreGet和PostGet事件以外的事件),觸發(fā)事件的條件 是需要程序員根據(jù)需要來設置的,然后調用handle類中的方法notify來廣 播這個事件已發(fā)生的消息。所
50、有的聽眾對象將等待廣播的消息,如果事 件與聽眾注冊的事件相匹配,將作出相應的動作。這里notify函數(shù)的原 型如下: notify(Hobj,EventName) 或 notify(Hobj,EventName,data) 上述notify函數(shù)的第一個參數(shù)Hobj表示事件定義的對象句柄,這里也可 以是對象句柄的數(shù)組;第二個參數(shù)就是這個對象中的事件名稱;第三個參 數(shù)data是封裝了有關事件數(shù)據(jù)的event.EventData對象。 例如我們想通過ToggleButton類中State 的值的改變來觸發(fā)事件 ToggledState的發(fā)生,從而來通知所有的聽眾。這就需要在該類中添加一個 觸發(fā)事件的
51、方法來調用notify函數(shù),具體方法如下: classdef ToggleButton handle properties State = false End events ToggledState end methods . function OnStateChange(obj,newState) % Call this method to check for state change if newState = obj.State obj.State = newState; Notify(obj,ToggledState); % Broadcast notice of event end
52、end end end 8.2.3如何響應事件(聽眾的定義) 定義聽眾的一般方法是用handle類中的成員函數(shù)addlistener完成的。 Addlistener函數(shù)的原型如下: Lh=addlistener(Hsource,EventName,callback) %(1) 或 lh=addlistener(Hsource,property,EventName,callback) %(2) 這里第一個函數(shù)用來為指定的事件創(chuàng)建一個聽眾,而第二個函數(shù)用來為 MATLAB中預定義的事件創(chuàng)建一個聽眾。參數(shù)Hsource是發(fā)生事件的句柄, 也可以是對象數(shù)組的句柄;參數(shù)EventName是Hsource所指對象中的事 件名稱;參數(shù)callback是函數(shù)句柄,即事件觸發(fā)時將執(zhí)行的回調函數(shù)。 返回值lh是event.listener型類的聽眾對象句柄,用來表示一個聽眾。 在To
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆湖南省長沙市明達中學高一化學第二學期期末教學質量檢測模擬試題含解析
- 山東省臨沭一中2025屆化學高一下期末監(jiān)測模擬試題含解析
- 湖北省黃崗市浠水實驗高中2025年高二化學第二學期期末檢測試題含解析
- 導游資格考試題庫及答案
- 單招考試題庫及答案七類
- 大專班英語考試題(a)及答案
- 大學美育選修課考試題及答案
- 大客車科目四考試題及答案
- 春招銀行考試題庫及答案
- 澄城縣科目一考試題目及答案
- GB/T 8813-2008硬質泡沫塑料壓縮性能的測定
- ge680ct用戶學習-技術手冊
- 金蝶云星空V7.7-產(chǎn)品培訓-供應鏈-庫存管理
- 簡約企業(yè)年會頒獎晚會盛典課件
- 小學英語短語大全62542
- 2023年惠州仲愷城市發(fā)展集團有限公司招聘筆試題庫及答案解析
- 勞動防護用品配備標準(國標)
- 國開經(jīng)濟學(本)1-14章練習試題及答案
- 安全生產(chǎn)費用提取計算公式(附計算模板)
- 赤平投影原理PPT
- 2021年包頭職業(yè)技術學院教師招聘試題及答案解析
評論
0/150
提交評論