MATLAB面向?qū)ο蟪绦蛟O(shè)計1.0版_第1頁
MATLAB面向?qū)ο蟪绦蛟O(shè)計1.0版_第2頁
MATLAB面向?qū)ο蟪绦蛟O(shè)計1.0版_第3頁
MATLAB面向?qū)ο蟪绦蛟O(shè)計1.0版_第4頁
MATLAB面向?qū)ο蟪绦蛟O(shè)計1.0版_第5頁
已閱讀5頁,還剩148頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

MATLAB面向?qū)ο蟪绦蛟O(shè)計第1章緒言1.1如何學(xué)會一門編程語言1.2做筆記的方法1.1如何學(xué)會一門編程語言1.一本好書或一套好的視頻:體系完整、講解生動、知識準(zhǔn)確2.一本好的練習(xí)冊:能夠得到充分的鍛煉,內(nèi)化知識3.一段比較孤獨的時間:不受干擾、深入學(xué)習(xí)、突破枯燥期4.留下筆記或電子文檔1.2做筆記的方法1.抓主干:瀏覽章節(jié),把定義、格式和本卷須知標(biāo)出。2.讀范例:仔細(xì)看解釋局部和example,理解內(nèi)容。3.記錄:把主干局部記錄下來,用作提醒和助記。4.練習(xí):練習(xí)這一章節(jié)的內(nèi)容5.豐富:根據(jù)練習(xí)結(jié)果添加意義、范例和說明第2章MATLAB根底知識MATLAB的help文檔MATLAB的help文檔是學(xué)習(xí)MATLAB的重要工具之一。MATLAB的help文檔有規(guī)那么定義、解釋說明和范例,很多問題可以在help文檔里找到答案。Matlab運算符1.算術(shù)運算符算術(shù)運算因所處理的對象不同,分為矩陣和數(shù)組算術(shù)運算兩類。2.關(guān)系運算符需要明確指出的是,MATLAB的關(guān)系運算雖可看成矩陣的關(guān)系運算,但嚴(yán)格地講,把關(guān)系運算定義在數(shù)組根底之上更為合理。關(guān)系運算是元素一對一的運算結(jié)果。3.邏輯運算符為提高運算速度,MATLAB還定義了針對標(biāo)量的先決與和先決或運算。先決與運算是當(dāng)該運算符的左邊為1(真)時,才繼續(xù)與該符號右邊的量做邏輯運算。先決或運算是當(dāng)運算符的左邊為1(真)時,就不需要繼續(xù)與該符號右邊的量做邏輯運算,而立即得出該邏輯運算結(jié)果為1(真);否那么,就要繼續(xù)與該符號右邊的量運算。4.運算符的優(yōu)先級和其他高級語言一樣,當(dāng)用多個運算符和運算量寫出一個MATLAB表達式時,運算符的優(yōu)先次序是一個必須明確的問題。MATLAB中的全局變量全局內(nèi)存是指內(nèi)存的一種特殊類型,它能夠被所有的工作區(qū)訪問。如果一個變量在函數(shù)中被聲明全局變量,那么它將占用的是全局內(nèi)存,而不是本地工作區(qū)。如果相同的變量在另一個函數(shù)中被聲明為全局變量,那么這個變量所占有內(nèi)存區(qū)域就是第一個函數(shù)中的相同變量。最好把全局變量聲明在函數(shù)的開頭,這樣可以區(qū)別于本地變量。在一個程序,你能利用全局內(nèi)存,在函數(shù)之間對大規(guī)模數(shù)據(jù)進行交換。如果想讓某個函數(shù)中定義的變量能夠被其他函數(shù)調(diào)用,需要用到全局變量。注意,在這兩個函數(shù)中都要用global修飾這個變量。如:functiont1globalx;x=0;functiont2globalx;y=xend圖形窗口及坐標(biāo)軸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]=meshgrid(x,y);z=x.*exp(-x.^2-y.^2);h=surf('Parent',ah,x,y,z,'FaceColor','flat','EdgeColor','b');MATLAB面向?qū)ο蟪绦蚝喗?〕類在MATLAB中,將類視作定義有特定行為的新的數(shù)據(jù)類型,與普通的類型數(shù)據(jù)不同,類是一組具有共同特性對象的抽象,不僅包含數(shù)據(jù),還包含了對數(shù)據(jù)的操作。對特定類的對象所定義的操作,稱為該類的方法。也可以將類看作可作為單獨實體對待的新工程。MATLAB中類的相關(guān)概念如下:類定義——描述一個類中所有實例的共有特征屬性——對類實例的數(shù)據(jù)存儲方法——特殊函數(shù),通常是在類實例中的操作事件——消息,當(dāng)發(fā)生一些特定的行為時由類定義和提供的類實例的播送。特性——值,修改屬性、事件、方法和類的狀態(tài)。聽眾——對象,當(dāng)事件通知播送時,對特定的事件作出響應(yīng)。對象——類的實例包——文件夾,一個類定義和函數(shù)命名的集合。2〕對象MATLAB中的對象是類的一個實例,這個實例包含實際數(shù)據(jù)所代表的特定實體。對象并不是被動的數(shù)據(jù)容器,對象還積極管理數(shù)據(jù),包括只允許特定的操作、數(shù)據(jù)隱藏、禁止外部用戶非法對數(shù)據(jù)的濫用等,對象對其控制直到其消失。MATLAB中類的設(shè)計、定義1.類的設(shè)計在MATLAB在,通常一個類可以分為兩個組成局部,即成員變量和成員函數(shù)。在類的設(shè)計過程中,就是要從眾多實例中抽象出共同特征,形成類。1〕定義類數(shù)據(jù)2〕定義類操作3〕定義類事件2.類的定義MATLAB類的定義由關(guān)鍵詞、屬性成員、方法和事件4個局部組成。Classdef類名Properties屬性endmethods方法endevent事件endend第3章MATLAB中的類和對象3.1類的聲明3.2類的屬性成員及訪問控制3.3類的方法及訪問控制3.4類的組合3.1類的聲明

類的聲明對象的創(chuàng)立和使用類的特性類定義的組織形式命名空間和包類的聲明

要在MATLAB中聲明一個類,可以采用兩種方式:其一是聲明為value型類〔值型類〕,其二是聲明為handle型類〔句柄型類〕。使用value型類對象可以用來表示一個實體數(shù)據(jù),用該類型對象復(fù)制另一對象時,那么其中一個對象數(shù)據(jù)的修改不會引起另一對象的改變,這是又有它們所占用的不是同一個存儲空間,因此它們在數(shù)據(jù)上是相互獨立的。在MATLAB中聲明一個value型類的一般格式如下:Classdef類名Properties屬性endmethods方法endevent事件endenumeration枚舉〔輸入?yún)?shù)〕endend對象的創(chuàng)立和使用MATLAB面向?qū)ο蟪绦蛟O(shè)計中創(chuàng)立一個對象的過程一般是通過調(diào)用類的構(gòu)造函數(shù)來實現(xiàn)的,其格式如下:對象名=類的構(gòu)造函數(shù)〔輸入?yún)?shù)〕訪問對象成員采用的是點〔.〕操作符,其一般形式是:對象名.類成員類的特性類的組織形式3.2類的屬性成員及訪問控制

屬性成員的聲明和初始化屬性成員的特性屬性成員的get和set方法屬性成員的訪問控制屬性成員的聲明和初始化

一個類的普通數(shù)據(jù)成員,我們可以安排在類的屬性成員局部,屬性成員塊中的成員可以按如下格式定義:Properties屬性成員1;屬性成員2;…end屬性成員的初始化可以通過兩種途徑來完成。第一種是在屬性成員塊內(nèi)為數(shù)據(jù)成員指定初始值。第二種初始化屬性成員的方法是用構(gòu)造函數(shù)來完成的,構(gòu)造函數(shù)的返回值一般都是一個對象,通過引用對象中的屬性成員將形參賦值給它們。屬性成員的特性屬性成員的get和set方法如果在創(chuàng)立好對象后,要改變屬性成員的值,對于具有公有訪問特性的屬性成員來說,可以直接通過對象來訪問該成員,從而重新設(shè)置其值。這說明MATLAB對一個類對象的屬性成員具有進行設(shè)置〔set〕和查詢〔get〕功能。屬性成員的get和set方法就是用來設(shè)置這種功能的。如果沒有編寫屬性成員的set和get方法,訪問對象的屬性成員時就會直接操作。如果編寫屬了性成員的set和get方法,訪問對象的屬性成員時MATLAB就會調(diào)用相應(yīng)的set和get方法,而不會再直接操作。Set方法的格式:functionobj=pertyName(obj,value);…EndValue就像一個匣子,裝入訪問對象時傳入的值,供set函數(shù)內(nèi)部進行相應(yīng)的操作。如obj.propertyName=10;那么MATLAB會令value=10。get方法的格式:functionvalue=pertyname〔obj〕…end同樣地,這里的value也是一個形參,代表查詢屬性成員時,MATLAB要提供的值。如>>pertyName%假設(shè)get函數(shù)使value=10;ans=103.2.4屬性成員的訪問控制3.3類的方法及其訪問控制普通方法及其訪問控制構(gòu)造函數(shù)靜態(tài)方法類型轉(zhuǎn)換方法普通方法及其訪問控制

普通方法的聲明方式一般有兩種:第一種是在類塊中給出完整的函數(shù)定義;第二種方式是在一個單獨分文件中給出函數(shù)的完整定義,而在類中只給出函數(shù)的聲明形式。在類塊中給出完整的函數(shù)定義

例子:ClassdefMyclassPropertiesx=1.0;endmethodsfunctionobj=Myclass〔val〕%構(gòu)造函數(shù)obj.x=val;endfunctiony=computeadd〔obj,val〕y=obj.x+val;endend格式如下:Methods

functionval1=fun1(obj,args1)

…endfunctionval2=fun2(obj,args2)…

endfunctionfun3(obj)…

endend調(diào)用方法時有如下兩種形式:obj.fun1(args1)和fun1(obj,args1〕例如:T=myclass〔5〕;computeadd(4);computeadd(T,4);構(gòu)造函數(shù)構(gòu)造函數(shù)是類中的一個特殊方法,MATLAB中構(gòu)造函數(shù)的主要作用是來完成對象的創(chuàng)立工作,與此同時可以對對象中的數(shù)據(jù)進行初始化。構(gòu)造函數(shù)也是類的一個方法,除了具有一般成員方法的特征之外,還具有一些特殊的性質(zhì):1〕構(gòu)造函數(shù)的函數(shù)名與類名相同。2〕構(gòu)造函數(shù)只能返回一個參數(shù),它是本類的一個對象,在類的所有方法中只能用構(gòu)造函數(shù)來創(chuàng)立一個對象。3〕構(gòu)造函數(shù)總是返回一個有效的類實例,而不是一個空對象。4〕如果類中沒有說明構(gòu)造函數(shù),那么MATLAB就會提供一個無輸入?yún)?shù)的構(gòu)造函數(shù)〔默認(rèn)構(gòu)造函數(shù)〕,并返回一個標(biāo)量對象,該對象中的屬性成員或被初始化為空〔[]〕,或按默認(rèn)值初始化。靜態(tài)方法類型轉(zhuǎn)換方法3.4類的組合內(nèi)嵌對象類的優(yōu)先級問題對象的保存與加載內(nèi)嵌對象實際上,類的屬性成員中也可以存放另一個類的實例。由此我們可以利用已有的類的實例來構(gòu)建新的復(fù)雜的類。

如果一個類中的某屬性成員存放的是另一個類的對象,我們在這里將這樣的成員成為內(nèi)嵌對象。類的優(yōu)先級問題1〕不同類之間包含同名函數(shù)時的優(yōu)先級問題可以通過設(shè)置類的優(yōu)先級來確定主導(dǎo)類。MATLAB中確定類之間的優(yōu)先級是通過設(shè)置一個類的inferiorClass特性來實現(xiàn)的,其格式如下:classdef(InferiorClass={?class1,?class2,…}myClass…End這說明class1、class2等的優(yōu)先級要低于myClass,即myClass相對于它們是主導(dǎo)類。如果沒有指定類的優(yōu)先級,那么在默認(rèn)情況下,在調(diào)用這些類的那個同名函數(shù)時,輸入?yún)?shù)最左邊的對象是主導(dǎo)對象2〕同名類之間的優(yōu)先級問題對象的保存與加載像MATLAB的普通變量一樣可以用命令save將工作空間的對象保存在mat文件中;當(dāng)這個對象從工作空間刪除后,這個對象可以從保存文件中用命令load加載到工作空間中來。Save和load的使用格式是:savefilenameobjectLoadfilenameobject第4章MATLAB中的繼承與派生4.1類的繼承與派生4.2派生類的構(gòu)造函數(shù)4.3多重繼承的成員標(biāo)識問題4.4指定容許派生的類4.5類成員的訪問控制4.6定義MATLAB內(nèi)置類型的派生類4.1類的繼承與派生繼承與派生的概念派生類的定義派生形成過程用派生類創(chuàng)立一個類的別名繼承與派生的概念MATLAB中通過派生〔classderivation〕的機制來支持繼承。被繼承的類型被稱為基類〔baseclass〕或超類〔superclass〕,而新產(chǎn)生的類那么為派生類〔derivedclass〕或子類〔subclass〕。派生類的定義MATLAB中,派生類的一般定義格式為:Classdef派生類名<基類名1&基類名2&…&基類名n

派生類成員聲明;End其中基類名1、基類名2、…、基類名n是已聲明的類。如果一個派生類同時有多個基類,那么這種情況稱為多重繼承〔multiple-inherit〕,這時的派生類同時得到了多個已有類的特征。如果一個派生類只有一個直接基類,這種情況就稱為單繼承〔single-inherit〕直接參與派生出某類的基類稱為直接基類,而基類的基類以及更深層的基類那么稱為間接基類。派生形成過程MATLAB生成一個派生類的過程分為:1.吸收基類成員:MATLAB的派生類實際上吸收了所有的基類成員〔注:基類的私有成員和構(gòu)造函數(shù)不會顯式地出現(xiàn)在派生類中〕。2.改造基類成員:如果派生類聲明了一個與基類同名的成員,派生類中的成員就屏蔽了基類的同名成員。這就是所謂的同名覆蓋。同名覆蓋包含屬性成員的同名覆蓋和方法的同名覆蓋。其中,屬性成員的同名覆蓋是有條件的:1〕.基類屬性成員的abstract特性是true〔即該屬性成員是抽象的〕。2〕.基類屬性成員的SetAcces和GetAccess特性是private。3.開展新成員:新成員必須與基類成員不同名。4.重寫構(gòu)造函數(shù)在派生類生成過程中,派生類不會將基類的類定義方面的相關(guān)屬性繼承過來。用派生類創(chuàng)立一個類的別名創(chuàng)立一個類的別名,可以通過建立一個空的派生類來實現(xiàn)classdefNewClassName<OldClassNameend這里類OldClassName是已有的類,類NewClassName就是類OldName的別名。注意:如果原來類中的構(gòu)造函數(shù)支持帶無參數(shù)輸入形式,那么就可以用類似上面定義的空的派生形式創(chuàng)立別名類。如果原來類的構(gòu)造函數(shù)不支持無參數(shù)輸入,那么別名類中就要求增加一個構(gòu)造函數(shù)。4.2派生類的構(gòu)造函數(shù)構(gòu)造函數(shù)的建立派生類構(gòu)造函數(shù)執(zhí)行的順序構(gòu)造函數(shù)的建立派生類構(gòu)造函數(shù)的輸入?yún)?shù)設(shè)計就應(yīng)考慮到基類數(shù)據(jù)成員和新增數(shù)據(jù)成員,其中一局部參數(shù)要傳遞給基類數(shù)據(jù)成員,而另一局部要傳遞給新增數(shù)據(jù)成員。派生類的構(gòu)造函數(shù)的一般定義形式為:派生類的構(gòu)造函數(shù)的一般定義形式為:Function對象名=派生類名〔參數(shù)總表〕對象名=對象名@基類名1〔參數(shù)表1〕;%@后面局部可看成基類1的構(gòu)造對象名=對象名@基類名1〔參數(shù)表1〕;%函數(shù)…對象名=對象名@基類名1〔參數(shù)表1〕;對象名.新增屬性成員1=參數(shù)1;…對象名.新增屬性成員M=參數(shù)M;end使用派生類構(gòu)造函數(shù)的本卷須知1.如果在調(diào)用派生類的構(gòu)造函數(shù)時,需要將參數(shù)傳給基類成員,那么在派生類構(gòu)造函數(shù)中要顯式地調(diào)用這些基類的構(gòu)造函數(shù),否那么MATLAB會隱式調(diào)用。2.如果在派生類構(gòu)造函數(shù)中要顯式地調(diào)用基類構(gòu)造函數(shù),那么這樣的調(diào)用應(yīng)在創(chuàng)立的對象引用之前來完成。3.一個派生類也可以不編寫構(gòu)造函數(shù),除非它的基類的構(gòu)造函數(shù)是帶輸入?yún)?shù)的。派生類構(gòu)造函數(shù)執(zhí)行的順序繼承順序ClassC(子類)ClassBClassA(基類)調(diào)用順序調(diào)用ClassC的構(gòu)造函數(shù)調(diào)用ClassB的構(gòu)造函數(shù)調(diào)用ClassA的構(gòu)造函數(shù)4.3多重繼承中的成員標(biāo)識問題屬性成員名稱沖突方法名稱沖突事件名稱沖突在MATLAB面向?qū)ο蟪绦蛟O(shè)計中,多重繼承一般不支持各個基類中帶有同名成員,但在一些特殊條件下允許出現(xiàn)同名成員。4.4指定容許派生的類4.5類成員的訪問控制屬性成員的訪問控制方法的訪問控制事件的訪問控制4.6定義MATLAB內(nèi)置類型的派生控制的內(nèi)置類定義MATLAB內(nèi)置類的派生類第5章handle類型5.1handle類型的聲明5.2類handle的介紹5.3屬性成員get/set接口的實現(xiàn)5.4動態(tài)屬性成員的實現(xiàn)5.5handle類型的析構(gòu)函數(shù)5.6handle兼容類5.7深拷貝與淺拷貝有時我們希望給對象創(chuàng)立一個引用,而不希望復(fù)制這個對象的數(shù)據(jù),這時就可以使用handle型類了。5.1handle類型的聲明Handle型類聲明形式與value型類聲明形式的根本不同之處是前者必須是類handle的派生類,而后者不是。類handle是MATLAB中已聲明的一個抽象類。聲明一個handle型類的格式是:Classdef類名<handle…endHandle型類的派生類也是handle型類。這時,我們不需要在handle型派生類中再次將handle指明為基類。聲明了一個handle型類之后就可以創(chuàng)立handle型類對象了,handle型類的對象簡稱為handle對象。創(chuàng)立handle對象形式和value型類是相同的,不同的是:創(chuàng)立handle對象時,構(gòu)造函數(shù)返回的不是被創(chuàng)立的對象,而是這個對象的句柄。MATLAB中的一個句柄也是一個變量,它是一個類實例的唯一標(biāo)識。當(dāng)我們復(fù)制一個句柄對象時,MATLAB復(fù)制的是句柄,不會復(fù)制這個對象中的數(shù)據(jù)。這個被復(fù)制的句柄引用的數(shù)據(jù)與原來的句柄引用的數(shù)據(jù)是一致的。除自定義的handle型類外,MATLAB中的句柄圖形〔handlegraphics)類型的行為特征也類似于handle型類。MATLAB在創(chuàng)立每個圖形對象時都為對象分配唯一的一個值,稱為圖形對象句柄〔handle〕。句柄是圖形對象的唯一標(biāo)識符。句柄圖形型類創(chuàng)立的對象就是MATLAB的圖形對象,句柄圖形型類創(chuàng)立一個對象時返回一個已創(chuàng)立對象的句柄。Handle型類可以通過句柄復(fù)制來實現(xiàn)對象的引用功能,除此之外,handle類型還具有如下一些特征:〔1〕.繼承類handle的方法;〔2〕.能夠定義事件和聽眾;〔3〕.定義動態(tài)屬性成員;〔4〕實現(xiàn)句柄圖形類型的get和set方法。5.2類handle的介紹類handle是MATLAB內(nèi)定義的一個抽象類。所謂抽象類就是只能作為基類,而不能直接用它定義對象。類handle是定義所有handle型類的基類,即要定義一個handle型類應(yīng)該以類handle為基類,或以handle型類為基類。類handle中沒有提供屬性成員,而提供了許多有用的方法,定義一個handle型類將繼承這些方法,這些方法的名稱和功能如下:5.3屬性成員get/set接口的實現(xiàn)在定義一些具有特殊要求的handle型類時,還可以用MATLAB中提供的兩個handle型類作為基類。這兩個類分別是類hgsetget和類dynamicprops,前者提供了set和get方法,使其能夠?qū)崿F(xiàn)句柄圖形〔handlegraphics〕類型的標(biāo)準(zhǔn)接口風(fēng)格,后者提供了能夠?qū)崿F(xiàn)動態(tài)屬性成員的功能。這兩個handle型類也是抽象類,不能直接定義對象。MATLAB中標(biāo)準(zhǔn)的句柄圖形系統(tǒng)實現(xiàn)了基于set和get方法的一個接口〔注:這里的兩個方法有別于屬性成員中的set和get方法〕,利用這些方法我們可以設(shè)置和查詢圖形對象的屬性值。Hgsetget類是handle的派生類,這個類實現(xiàn)這些方法的實現(xiàn)過程。我們以hgsetget類為基類聲明的handle型類就可以繼承這些功能,這樣的類就是一個set/get接口類。與屬性成員的set和get方法調(diào)用方式不同,hesetget類的set/get接口方法調(diào)用既可以按在對象上用操作符“.”引用屬性成員的方式進行設(shè)置和查詢,也可以直接按普通函數(shù)的方式調(diào)用,如:V=get(h,’PropertyName’);或V=h.PropertyName;這里v返回句柄對象h中成員PropertyName的值。set〔h,’PropertyName’,PropertyValue);或h.PropertyName=PropertyValue;就是將句柄對象h中的成員PropertyName的值設(shè)置為PropertyValue。5.4動態(tài)屬性成員的實現(xiàn)有時在使用這些同一個類的對象時,希望個別對象上附加上一些臨時的數(shù)據(jù),這些數(shù)據(jù)有別于其他對象的屬性成員,而這些成員不用在類聲明中提前給出,這些成員就是動態(tài)屬性成員。在MATLAB中可以通過類dynamicprops的派生類來實現(xiàn)這種功能。類dynamicprops是MATLAB內(nèi)定義的handle型抽象類,它提供了能夠?qū)崿F(xiàn)動態(tài)屬性成員的功能。類dynamicprops除繼承類handle的所有方法外,還增加了一個addprop方法,它的功能是向一個句柄對象添加一個屬性成員的名稱,其使用格式如下:

P=addprop(H,’PropertyName’)這里P是meta.DynamicProperty對象數(shù)組,H是一個句柄數(shù)組,PropertyName是要附加給這些對象的動態(tài)屬性成員名稱。在對象上添加動態(tài)屬性成員時,動態(tài)屬性成員名稱除應(yīng)遵循具有一般變量的命名規(guī)那么外,還應(yīng)注意:1〕.不能與這個類中的方法同名;2〕.不能與這個類中的事件同名;3〕.名稱中不能包含操作符“.”;例如定義一個dynamicprops的派生類:classdefMyButton<dynamicpropspropertiesUiHandleend

methodsfunctionobj=MyButton(pos)%構(gòu)造函數(shù),%名稱與類名一致,注意大小寫

ifnargin>0iflength(pos)==4

obj.UiHandle=uicontrol('Position',pos,...'Style','pushbutton');elseerror('Improperposition')endendendendend>>hbutton1=MyButton([20,40,100,40]);%創(chuàng)立對象>>addprop(hbutton1,‘Caption’);%添加動態(tài)屬性成員>>hbutton1.Caption=‘OK’;%給成員Caption賦值>>set(hbutton1.UiHandle,‘string’,hbutton1.Caption);%給定制的按鈕加標(biāo)題在對一個對象上增加了動態(tài)屬性成員之后就可以像普通屬性成員一樣來使用了:1.可以通過對象用點操作符來設(shè)置和查詢該成員;2.當(dāng)保存和加載對象時,MATLAB也會把動態(tài)屬性成員進行保存和加載。3.可以為動態(tài)屬性成員定義特性。4.可以為動態(tài)屬性成員編寫set和get函數(shù);5.可以聽到動態(tài)屬性成員引發(fā)的事件;6.通過對象數(shù)組訪問動態(tài)屬性成員的值。為這個動態(tài)屬性成員設(shè)置相應(yīng)的特性,其方法是通過addprop返回值中的meta.DynamicProperty對象來設(shè)置,如:>>p1=addprop(hbutton1,‘Caption’);%添加動態(tài)屬性成員Caption>>hbutton1.Caption=‘OK’;%給成員Caption賦值>>p1.Constant=true;%設(shè)置成員Caption的特性可以為動態(tài)屬性成員編寫自己的get和set函數(shù)。實現(xiàn)動態(tài)屬性成員的set和get函數(shù)步驟是:1.定義一個函數(shù)來完成動態(tài)屬性成員進行設(shè)置和查詢之前希望完成的工作,其格式為myset(obj,val)或val=myGet(obj);2.獲得動態(tài)屬性成員對應(yīng)的meta.DynamicProperty對象;3.將我們定義好的動態(tài)屬性成員設(shè)置或查詢函數(shù)句柄指派到meta.DynamicProperty對象的GetMethod或SetMethod成員上。我們定義的這個函數(shù)不必是這個類的方法,這時我們不能用類似set.PropertyName這種形式的函數(shù)名。使用dynamicprops作為基類,我們就可以在該派生類對象上動態(tài)地添加屬性成員。此外這些動態(tài)屬性成員還可以產(chǎn)生一些事件。5.5handle型類的析構(gòu)函數(shù)MATLAB創(chuàng)立一個對象是通過構(gòu)造函數(shù)來實現(xiàn)的,當(dāng)一個對象的生命周期即將結(jié)束時,MATLAB會自動地去調(diào)用一個特殊的方法進行善后工作,這個特殊的方法就是析構(gòu)函數(shù)〔destructor〕。在handle型類中析構(gòu)函數(shù)的主要特征是函數(shù)名必須是delete,并以普通方法形式定義。除此之外,必須具備如下條件MATLAB才會把delete方法當(dāng)作一個有效的析構(gòu)函數(shù):1.delete方法必須有一個標(biāo)量輸入,即本類對象;2.不帶輸出參數(shù);3.不能是密封的方法、靜態(tài)的方法或抽象方法,即方法的特性不能是Sealed,Static或Abstract。聲明一個析構(gòu)函數(shù)的方法的一般格式:Methods

functiondelete(obj)%析構(gòu)函數(shù),obj是一個本類對象

endEnd如果一個類的析構(gòu)函數(shù)不必做其他工作,我們也不用在類中顯式地重寫一個析構(gòu)函數(shù),這是因為類handle中已定義了一個析構(gòu)函數(shù)delete,因此這個析構(gòu)函數(shù)也被繼承過來了。5.6handle-兼容類Handle型類和value型類可以在同一場合下使用,這時就需要涉及到handle型類與value型類的兼容性問題。如果一個類可以和handle型類進行組合構(gòu)成基類來創(chuàng)立派生類,那么這樣的類就稱為handle-兼容類。所有的handle型類都是handle兼容的。Handle-兼容類遵循如下規(guī)那么:1.handle-兼容類的所有基類必須是handle-兼容類;2.如果在一個類定義明確了HandleCompatible特性值為false,那么該類的所有基類中就不能有handle型類;3.如果在一個類聲明沒有明確設(shè)置HandleCompatible特性,而有一個基類是handle型類,那么所有的基類都必須是handle-兼容的;4.特性HandleCompatible不能被繼承。Value型類、handle型類與handle-兼容類關(guān)系圖Handle型類Handle-兼容類Value型類繼承關(guān)系Handle-兼容類Handle型類Value型handle-兼容類基類:Handle型類非handle兼容類派生類:繼承于繼承于一個handle兼容類說明它可以和handle型類進行組合構(gòu)成基類來創(chuàng)立派生類。當(dāng)我們在定義抽象基類時,handle-兼容類提供了很大的靈活性,如在設(shè)計一個接口類時,基類可以被設(shè)計成既支持handle型派生類,又支持value型派生類。Handle-兼容類可到達一物兩用的效果。在設(shè)計handle-兼容類的方法時,需要兼顧到傳參給方法的參數(shù)可能是handle型對象也可能是value型對象。在調(diào)用時應(yīng)考慮到會有兩種不同的行為:1〕.如果是以handle型對象為方法的輸入?yún)?shù),那么執(zhí)行方法會改變handle型對象,這種改變對所有工作空間中的同名句柄都生效。2〕.如果是以value型對象為方法的輸入?yún)?shù),那么執(zhí)行方法僅會改變方法空間內(nèi)部的對象。因此,如果handle-兼容類的一個方法既要操作handle型對象,又要操作value型對象,那么這個方法就應(yīng)返回一個修改的對象。5.7深拷貝與淺拷貝深拷貝與淺拷貝的概念類簡介深拷貝的實現(xiàn)深拷貝與淺拷貝的概念當(dāng)a、b為value型類的對象時,將A復(fù)制給b后,改變對象B的屬性的值不會對對象A的對應(yīng)屬性的值產(chǎn)生影響。這種value型對象的復(fù)制就叫做深拷貝。當(dāng)a、b為handle型類的對象時,將A復(fù)制給b后,改變對象B的屬性的值會對對象A的對應(yīng)屬性的值產(chǎn)生影響,a、b在數(shù)據(jù)上不是完全獨立的兩個單元。這種handle型對象的復(fù)制就叫做淺拷貝。Handle型類對象之間進行復(fù)制時,一般是淺拷貝。那么這種對象之間能否實現(xiàn)深拷貝呢?類簡介5.7.3深拷貝的實現(xiàn)第6章對象陣列6.1MATLAB中常用的陣列形式6.2創(chuàng)立對象陣列6.3不同類型對象組成的陣列6.4多對象陣列6.1MATLAB中常用的陣列形式6.1MATLAB中常用的陣列形式6.2創(chuàng)立對象陣列6.3不同類型對象組成對象陣列6.4多對象陣列6.1.1陣列的概念6.1.2幾種常用的陣列1.數(shù)值陣列2.字符陣列3.邏輯陣列4.元胞陣列5.結(jié)構(gòu)體陣列6.函數(shù)句柄陣列單元陣列是matlab中特殊一種數(shù)組,它的元素被稱為單元〔cells〕,它可以存儲其它類型的matlab數(shù)組。例如,一個單元陣列的一個單元可能包含一個實數(shù)數(shù)組或字符型數(shù)組,還可能是復(fù)數(shù)組〔圖7.1所示〕在一個編程工程中,一個單元陣列的每一個元素都是一個指針,指向其他的數(shù)據(jù)結(jié)構(gòu),而這些數(shù)據(jù)結(jié)構(gòu)可以是不同的數(shù)據(jù)類型。單元陣列為選擇問題信息提供極好的方示,因為所有信息都聚集在一起,并可以通邊一單個名字訪問。單元陣列用大括號{}替代小括號來選擇和顯示單元的內(nèi)容。這個不同是由于單元的內(nèi)容用數(shù)據(jù)結(jié)構(gòu)代替了內(nèi)容。假設(shè)一單元陣列如圖7.2所示。元素a(1,1)是數(shù)據(jù)結(jié)構(gòu)3×3的數(shù)字?jǐn)?shù)組。a(1,1)的含義為顯示這個單元的內(nèi)容,它是一個數(shù)據(jù)結(jié)構(gòu)。6.2創(chuàng)立對象陣列如何創(chuàng)立對象陣列在對象陣列上添加動態(tài)屬性成員陣列不僅可以由根本數(shù)據(jù)類型組成,也可以由類的多個實例構(gòu)成。對象陣列〔objectarrays〕的元素是類的實例,不僅具有數(shù)據(jù)成員,還有操作這些數(shù)據(jù)的方法。因此對象陣列具有一定的特殊之處。在MATLAB面向?qū)ο蟪绦蛟O(shè)計中,一個對象陣列的所有元素可以源自同類型的實例,也可以不是。如何創(chuàng)立對象陣列1〕比較常用的方法是使用循環(huán)語句依次對陣列中每個元素用對象來初始化,例如下面的循環(huán)語句創(chuàng)立了一個2*3對象陣列A:fori=1:2forj=1:3A(i,j)=Myclass(i+j);endend這里Myclass是一個類。2〕用下標(biāo)索賦值的方式,同時通過對陣列最后一個元素的賦值來創(chuàng)立對象陣列。例如我們聲明一個類:classdefSimpleClassPropertiesValueendmethodsfunctionobj=simpleClass(v)ifnargin>0%支持無參數(shù)輸入obj.Value=val;endendendend

定義一個對象a:a=SimpleClass(6);再用該對象初始化陣列的最后一個元素:A〔2,3〕=a;這樣A就是一個2*3的對象陣列了,也可以直接通過調(diào)用SimpleClass的構(gòu)造函數(shù)來初始化陣列A,即:A〔2,3〕=SimpleClass〔6〕此時對象陣列的沒一個對象都初始化了。而對象陣列A中的最后一個元素是帶參數(shù)輸入的構(gòu)造函數(shù)創(chuàng)立的對象,而其余元素是無參數(shù)輸入情況下構(gòu)造函數(shù)創(chuàng)立的對象。因此在這種方式創(chuàng)立對象陣列時,類構(gòu)造函數(shù)要支持無參數(shù)輸入的情況〔即標(biāo)*的語句〕,否那么會提示錯誤。3〕在一個類的構(gòu)造函數(shù)實現(xiàn)局部構(gòu)建對象陣列。這時構(gòu)造函數(shù)的返回值就是應(yīng)是一個對象陣列。例如,下面類的構(gòu)造函數(shù)中就實現(xiàn)了這種過程。ClassdefArrayClassPropertiesData;endmethodsfunctionobj=ArrayClass(Matrix)ifnargin~=0;[m,n]=size(Matrix);

obj(m,n)=ArrayClass;%預(yù)分配對象空間陣列

fori=1:mforj=1:nobj(I,j).Data=Maxtrix(i,j);EndEndEndEndEndEnd在上面類的構(gòu)造函數(shù)中,首先為對象陣列的每個元素預(yù)分配空間,在這個過程中MATLAB首先對最后一個元素用左端的對象進行賦值,然后依次用默認(rèn)ArrayClass對象〔無參數(shù)輸入情況下構(gòu)建的對象〕來填充,從第一個元素到倒數(shù)第二個元素。預(yù)分配陣列對象之后,就為每個元素對象的data依次用輸入矩陣matrix的對應(yīng)元素賦值。例如:>>M=magic(5);%創(chuàng)立5階魔方矩陣>>c=ArrayClass(M)%創(chuàng)立5*5對象陣列〔4〕通過空陣列來創(chuàng)立對象陣列。沒有元素的陣列就是一個空陣列,但它有確定的類型。所有的非抽象類都具有一個靜態(tài)方法empty,它的任務(wù)是創(chuàng)立一個同類型的空陣列。Empty方法能夠使我們指定輸出陣列的維數(shù),但必須要使某一維為0,例如:>>E=SimpleClass.empty(4,0);創(chuàng)立了一個4*0的SimpleClass型空陣列。當(dāng)無輸入?yún)?shù)時,創(chuàng)立的0*0的空陣列。如果我們給屬性成員賦值,那么MATLAB會調(diào)用SimpleClass的構(gòu)造函數(shù)來擴展出一個指定大小的陣列:>>E(4,6).value=7>>EE=4x6SimpleClassProperties:value這里擴展出了一個4x6的對象陣列E。在這種情況下,MATLAB用SimpleClass無參構(gòu)造函數(shù)創(chuàng)立的對象來填充除第4行第6列以外的所有元素。然后,MATLAB把數(shù)值7賦值到對象E(4,6)的屬性成員Value上。

如果一個對象陣列中的元素是由handle型對象構(gòu)成的,那么在初始化這些對象時有些特殊之處。在用handle型對象擴展一個對象陣列時,MATLAB僅調(diào)用類的構(gòu)造函數(shù)一次,然后為陣列中的每個元素創(chuàng)立唯一的句柄,這時MATLAB不調(diào)用構(gòu)造函數(shù),而從已創(chuàng)立的對象復(fù)制屬性成員的值給其余的元素。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)屬性成員事件響應(yīng)8.1事件和聽眾的概念事件的概念及事件模型聽眾的概念事件的概念及事件模型

什么是事件呢?

事件的含義很廣泛。一般來說,從程序上可探測到的任何動作,都能夠產(chǎn)生相應(yīng)的事件,并可以將該事件的發(fā)生告知其他對象,來實現(xiàn)對象之間的通信。這里的事件是用來標(biāo)識發(fā)生的某件事情的。在MATLAB面向?qū)ο蟪绦蛟O(shè)計中,事件表示發(fā)生在類實例〔對象〕中的某些變化或行為,這些變化包括:〔1〕對類〔對象〕中的數(shù)據(jù)的修改;〔2〕方法的執(zhí)行;〔3〕查詢或設(shè)置一個屬性成員值;〔4〕析構(gòu)一個對象。在MATLAB中,事件驅(qū)動和事件響應(yīng)過程構(gòu)成了一個完整的事件模型。組織一個事件模型的一般步驟如下。〔1〕命名事件:在一個handle型類中聲明一個標(biāo)識符來代表事件,這個類就是產(chǎn)生事件的類,簡稱事件類,相應(yīng)的實例稱為事件對象;〔2〕創(chuàng)立聽眾:在一個類中聲明事件后,就可以關(guān)聯(lián)一個聽眾,一般用addlistener函數(shù)來定義聽眾;〔3〕定義一個方法來確定何時觸發(fā)這個事件,并通過notify函數(shù)對聽眾進行播送來告之該事件的發(fā)生?!?〕定義回調(diào)函數(shù):當(dāng)聽眾接受到某事件發(fā)生的信息時,就會去執(zhí)行一個與之關(guān)聯(lián)的回調(diào)函數(shù),因此還要定義一個回調(diào)函數(shù)。在定義聽眾時,既可以將該聽眾與產(chǎn)生事件的對象生命周期進行綁定,也可以將其限制在聽眾對象的生存期和作用范圍內(nèi)。聽眾的概念在MATLAB中,聽眾是用來接收事件發(fā)生消息的對象,是event.listener型類的對象。在MATLAB面向?qū)ο蟪绦蛟O(shè)計中,定義一個聽眾可以采用兩種方法:一種方法是使用handle類中的addlistener函數(shù);另一種方法是直接調(diào)用event.listener類的構(gòu)造函數(shù)。一旦聽眾創(chuàng)立后,它會一直等待事件發(fā)生的消息,一旦關(guān)聯(lián)的事件發(fā)生了,聽眾就會執(zhí)行一個回調(diào)函數(shù)。這里event.listener類是handle的子類。Property(屬性成員)Purpose(意義)Source事件對象元胞數(shù)組Event事件名Callback事件觸發(fā)時執(zhí)行的回調(diào)函數(shù)(這時需要將特性Enable設(shè)置為trueEnabled是否執(zhí)行回調(diào)函數(shù)的開關(guān)(默認(rèn)值為true)Recursive回調(diào)函數(shù)是否遞歸調(diào)用8.2定義事件和聽眾如何命名一個事件事件觸發(fā)和播送如何響應(yīng)事件〔聽眾的定義〕聽眾的幾種創(chuàng)立方式回調(diào)函數(shù)定義和調(diào)用如何命名一個事件

在MATLAB面向?qū)ο蟪绦蛟O(shè)計中,一個事件要用一個名稱來標(biāo)識。在一個類的events事件塊中聲明一個標(biāo)識符,便可定義該類中的一個事件的標(biāo)識,我們把這樣的標(biāo)識也稱為事件,其格式如下:Classdef類名<handle

events

事件名endEnd例如在下面Mclock中定義了一個事件Alarm,我們可以通過改變成員Enable的值來觸發(fā)這個事件。Classdef

Mclock<handle

properties

Enable=false;%是否啟動endevents

Alarm%鬧鐘

endEnd事件觸發(fā)和播送

當(dāng)定義了事件的類中某些成員滿足一定條件時〔屬性成員值被更新等〕,我們就說這個事件觸發(fā)了或發(fā)生了。對于用戶自定義的事件〔即除preSet、PostSet、PreGet和PostGet事件以外的事件〕,觸發(fā)事件的條件是需要程序員根據(jù)需要來設(shè)置的,然后調(diào)用handle類中的方法notify來播送這個事件已發(fā)生的消息。所有的聽眾對象將等待播送的消息,如果事件與聽眾注冊的事件相匹配,將作出相應(yīng)的動作。這里notify函數(shù)的原型如下:

notify〔Hobj,’EventName’)或notify(Hobj,’EventName’,data)上述notify函數(shù)的第一個參數(shù)Hobj表示事件定義的對象句柄,這里也可以是對象句柄的數(shù)組;第二個參數(shù)就是這個對象中的事件名稱;第三個參數(shù)data是封裝了有關(guān)事件數(shù)據(jù)的event.EventData對象。例如我們想通過ToggleButton類中State的值的改變來觸發(fā)事件ToggledState的發(fā)生,從而來通知所有的聽眾。這就需要在該類中添加一個觸發(fā)事件的方法來調(diào)用notify函數(shù),具體方法如下:classdefToggleButton<handlepropertiesState=falseEndeventsToggledStateendmethods...functionOnStateChange(obj,newState)%CallthismethodtocheckforstatechangeifnewState~=obj.Stateobj.State=newState;Notify(obj,'ToggledState');%Broadcastnoticeofeventendendendend如何響應(yīng)事件〔聽眾的定義〕定義聽眾的一般方法是用handle類中的成員函數(shù)addlistener完成的。Addlistener函數(shù)的原型如下:Lh=addlistener(Hsource,’EventName’,callback)%(1)或lh=addlistener(Hsource,property,’EventName’,callback)%(2)這里第一個函數(shù)用來為指定的事件創(chuàng)立一個聽眾,而第二個函數(shù)用來為MATLAB中預(yù)定義的事件創(chuàng)立一個聽眾。參數(shù)Hsource是發(fā)生事件的句柄,也可以是對象數(shù)組的句柄;參數(shù)EventName是Hsource所指對象中的事件名稱;參數(shù)callback是

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論