




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
MATLAB面向?qū)ο蟪绦蛟O(shè)計(jì)第1章緒言1.1如何學(xué)會(huì)一門(mén)編程語(yǔ)言1.2做筆記的方法1.1如何學(xué)會(huì)一門(mén)編程語(yǔ)言1.一本好書(shū)或一套好的視頻:體系完整、講解生動(dòng)、知識(shí)準(zhǔn)確2.一本好的練習(xí)冊(cè):能夠得到充分的鍛煉,內(nèi)化知識(shí)3.一段比較孤獨(dú)的時(shí)間:不受干擾、深入學(xué)習(xí)、突破枯燥期4.留下筆記或電子文檔1.2做筆記的方法1.抓主干:瀏覽章節(jié),把定義、格式和本卷須知標(biāo)出。2.讀范例:仔細(xì)看解釋局部和example,理解內(nèi)容。3.記錄:把主干局部記錄下來(lái),用作提醒和助記。4.練習(xí):練習(xí)這一章節(jié)的內(nèi)容5.豐富:根據(jù)練習(xí)結(jié)果添加意義、范例和說(shuō)明第2章MATLAB根底知識(shí)MATLAB的help文檔MATLAB的help文檔是學(xué)習(xí)MATLAB的重要工具之一。MATLAB的help文檔有規(guī)那么定義、解釋說(shuō)明和范例,很多問(wèn)題可以在help文檔里找到答案。Matlab運(yùn)算符1.算術(shù)運(yùn)算符算術(shù)運(yùn)算因所處理的對(duì)象不同,分為矩陣和數(shù)組算術(shù)運(yùn)算兩類(lèi)。2.關(guān)系運(yùn)算符需要明確指出的是,MATLAB的關(guān)系運(yùn)算雖可看成矩陣的關(guān)系運(yùn)算,但嚴(yán)格地講,把關(guān)系運(yùn)算定義在數(shù)組根底之上更為合理。關(guān)系運(yùn)算是元素一對(duì)一的運(yùn)算結(jié)果。3.邏輯運(yùn)算符為提高運(yùn)算速度,MATLAB還定義了針對(duì)標(biāo)量的先決與和先決或運(yùn)算。先決與運(yùn)算是當(dāng)該運(yùn)算符的左邊為1(真)時(shí),才繼續(xù)與該符號(hào)右邊的量做邏輯運(yùn)算。先決或運(yùn)算是當(dāng)運(yùn)算符的左邊為1(真)時(shí),就不需要繼續(xù)與該符號(hào)右邊的量做邏輯運(yùn)算,而立即得出該邏輯運(yùn)算結(jié)果為1(真);否那么,就要繼續(xù)與該符號(hào)右邊的量運(yùn)算。4.運(yùn)算符的優(yōu)先級(jí)和其他高級(jí)語(yǔ)言一樣,當(dāng)用多個(gè)運(yùn)算符和運(yùn)算量寫(xiě)出一個(gè)MATLAB表達(dá)式時(shí),運(yùn)算符的優(yōu)先次序是一個(gè)必須明確的問(wèn)題。MATLAB中的全局變量全局內(nèi)存是指內(nèi)存的一種特殊類(lèi)型,它能夠被所有的工作區(qū)訪(fǎng)問(wèn)。如果一個(gè)變量在函數(shù)中被聲明全局變量,那么它將占用的是全局內(nèi)存,而不是本地工作區(qū)。如果相同的變量在另一個(gè)函數(shù)中被聲明為全局變量,那么這個(gè)變量所占有內(nèi)存區(qū)域就是第一個(gè)函數(shù)中的相同變量。最好把全局變量聲明在函數(shù)的開(kāi)頭,這樣可以區(qū)別于本地變量。在一個(gè)程序,你能利用全局內(nèi)存,在函數(shù)之間對(duì)大規(guī)模數(shù)據(jù)進(jìn)行交換。如果想讓某個(gè)函數(shù)中定義的變量能夠被其他函數(shù)調(diào)用,需要用到全局變量。注意,在這兩個(gè)函數(shù)中都要用global修飾這個(gè)變量。如: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ū)ο蟪绦蚝?jiǎn)介1〕類(lèi)在MATLAB中,將類(lèi)視作定義有特定行為的新的數(shù)據(jù)類(lèi)型,與普通的類(lèi)型數(shù)據(jù)不同,類(lèi)是一組具有共同特性對(duì)象的抽象,不僅包含數(shù)據(jù),還包含了對(duì)數(shù)據(jù)的操作。對(duì)特定類(lèi)的對(duì)象所定義的操作,稱(chēng)為該類(lèi)的方法。也可以將類(lèi)看作可作為單獨(dú)實(shí)體對(duì)待的新工程。MATLAB中類(lèi)的相關(guān)概念如下:類(lèi)定義——描述一個(gè)類(lèi)中所有實(shí)例的共有特征屬性——對(duì)類(lèi)實(shí)例的數(shù)據(jù)存儲(chǔ)方法——特殊函數(shù),通常是在類(lèi)實(shí)例中的操作事件——消息,當(dāng)發(fā)生一些特定的行為時(shí)由類(lèi)定義和提供的類(lèi)實(shí)例的播送。特性——值,修改屬性、事件、方法和類(lèi)的狀態(tài)。聽(tīng)眾——對(duì)象,當(dāng)事件通知播送時(shí),對(duì)特定的事件作出響應(yīng)。對(duì)象——類(lèi)的實(shí)例包——文件夾,一個(gè)類(lèi)定義和函數(shù)命名的集合。2〕對(duì)象MATLAB中的對(duì)象是類(lèi)的一個(gè)實(shí)例,這個(gè)實(shí)例包含實(shí)際數(shù)據(jù)所代表的特定實(shí)體。對(duì)象并不是被動(dòng)的數(shù)據(jù)容器,對(duì)象還積極管理數(shù)據(jù),包括只允許特定的操作、數(shù)據(jù)隱藏、禁止外部用戶(hù)非法對(duì)數(shù)據(jù)的濫用等,對(duì)象對(duì)其控制直到其消失。MATLAB中類(lèi)的設(shè)計(jì)、定義1.類(lèi)的設(shè)計(jì)在MATLAB在,通常一個(gè)類(lèi)可以分為兩個(gè)組成局部,即成員變量和成員函數(shù)。在類(lèi)的設(shè)計(jì)過(guò)程中,就是要從眾多實(shí)例中抽象出共同特征,形成類(lèi)。1〕定義類(lèi)數(shù)據(jù)2〕定義類(lèi)操作3〕定義類(lèi)事件2.類(lèi)的定義MATLAB類(lèi)的定義由關(guān)鍵詞、屬性成員、方法和事件4個(gè)局部組成。Classdef類(lèi)名Properties屬性endmethods方法endevent事件endend第3章MATLAB中的類(lèi)和對(duì)象3.1類(lèi)的聲明3.2類(lèi)的屬性成員及訪(fǎng)問(wèn)控制3.3類(lèi)的方法及訪(fǎng)問(wèn)控制3.4類(lèi)的組合3.1類(lèi)的聲明
類(lèi)的聲明對(duì)象的創(chuàng)立和使用類(lèi)的特性類(lèi)定義的組織形式命名空間和包類(lèi)的聲明
要在MATLAB中聲明一個(gè)類(lèi),可以采用兩種方式:其一是聲明為value型類(lèi)〔值型類(lèi)〕,其二是聲明為handle型類(lèi)〔句柄型類(lèi)〕。使用value型類(lèi)對(duì)象可以用來(lái)表示一個(gè)實(shí)體數(shù)據(jù),用該類(lèi)型對(duì)象復(fù)制另一對(duì)象時(shí),那么其中一個(gè)對(duì)象數(shù)據(jù)的修改不會(huì)引起另一對(duì)象的改變,這是又有它們所占用的不是同一個(gè)存儲(chǔ)空間,因此它們?cè)跀?shù)據(jù)上是相互獨(dú)立的。在MATLAB中聲明一個(gè)value型類(lèi)的一般格式如下:Classdef類(lèi)名Properties屬性endmethods方法endevent事件endenumeration枚舉〔輸入?yún)?shù)〕endend對(duì)象的創(chuàng)立和使用MATLAB面向?qū)ο蟪绦蛟O(shè)計(jì)中創(chuàng)立一個(gè)對(duì)象的過(guò)程一般是通過(guò)調(diào)用類(lèi)的構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)的,其格式如下:對(duì)象名=類(lèi)的構(gòu)造函數(shù)〔輸入?yún)?shù)〕訪(fǎng)問(wèn)對(duì)象成員采用的是點(diǎn)〔.〕操作符,其一般形式是:對(duì)象名.類(lèi)成員類(lèi)的特性類(lèi)的組織形式3.2類(lèi)的屬性成員及訪(fǎng)問(wèn)控制
屬性成員的聲明和初始化屬性成員的特性屬性成員的get和set方法屬性成員的訪(fǎng)問(wèn)控制屬性成員的聲明和初始化
一個(gè)類(lèi)的普通數(shù)據(jù)成員,我們可以安排在類(lèi)的屬性成員局部,屬性成員塊中的成員可以按如下格式定義:Properties屬性成員1;屬性成員2;…end屬性成員的初始化可以通過(guò)兩種途徑來(lái)完成。第一種是在屬性成員塊內(nèi)為數(shù)據(jù)成員指定初始值。第二種初始化屬性成員的方法是用構(gòu)造函數(shù)來(lái)完成的,構(gòu)造函數(shù)的返回值一般都是一個(gè)對(duì)象,通過(guò)引用對(duì)象中的屬性成員將形參賦值給它們。屬性成員的特性屬性成員的get和set方法如果在創(chuàng)立好對(duì)象后,要改變屬性成員的值,對(duì)于具有公有訪(fǎng)問(wèn)特性的屬性成員來(lái)說(shuō),可以直接通過(guò)對(duì)象來(lái)訪(fǎng)問(wèn)該成員,從而重新設(shè)置其值。這說(shuō)明MATLAB對(duì)一個(gè)類(lèi)對(duì)象的屬性成員具有進(jìn)行設(shè)置〔set〕和查詢(xún)〔get〕功能。屬性成員的get和set方法就是用來(lái)設(shè)置這種功能的。如果沒(méi)有編寫(xiě)屬性成員的set和get方法,訪(fǎng)問(wèn)對(duì)象的屬性成員時(shí)就會(huì)直接操作。如果編寫(xiě)屬了性成員的set和get方法,訪(fǎng)問(wèn)對(duì)象的屬性成員時(shí)MATLAB就會(huì)調(diào)用相應(yīng)的set和get方法,而不會(huì)再直接操作。Set方法的格式:functionobj=pertyName(obj,value);…EndValue就像一個(gè)匣子,裝入訪(fǎng)問(wèn)對(duì)象時(shí)傳入的值,供set函數(shù)內(nèi)部進(jìn)行相應(yīng)的操作。如obj.propertyName=10;那么MATLAB會(huì)令value=10。get方法的格式:functionvalue=pertyname〔obj〕…end同樣地,這里的value也是一個(gè)形參,代表查詢(xún)屬性成員時(shí),MATLAB要提供的值。如>>pertyName%假設(shè)get函數(shù)使value=10;ans=103.2.4屬性成員的訪(fǎng)問(wèn)控制3.3類(lèi)的方法及其訪(fǎng)問(wèn)控制普通方法及其訪(fǎng)問(wèn)控制構(gòu)造函數(shù)靜態(tài)方法類(lèi)型轉(zhuǎn)換方法普通方法及其訪(fǎng)問(wèn)控制
普通方法的聲明方式一般有兩種:第一種是在類(lèi)塊中給出完整的函數(shù)定義;第二種方式是在一個(gè)單獨(dú)分文件中給出函數(shù)的完整定義,而在類(lèi)中只給出函數(shù)的聲明形式。在類(lèi)塊中給出完整的函數(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)用方法時(shí)有如下兩種形式:obj.fun1(args1)和fun1(obj,args1〕例如:T=myclass〔5〕;computeadd(4);computeadd(T,4);構(gòu)造函數(shù)構(gòu)造函數(shù)是類(lèi)中的一個(gè)特殊方法,MATLAB中構(gòu)造函數(shù)的主要作用是來(lái)完成對(duì)象的創(chuàng)立工作,與此同時(shí)可以對(duì)對(duì)象中的數(shù)據(jù)進(jìn)行初始化。構(gòu)造函數(shù)也是類(lèi)的一個(gè)方法,除了具有一般成員方法的特征之外,還具有一些特殊的性質(zhì):1〕構(gòu)造函數(shù)的函數(shù)名與類(lèi)名相同。2〕構(gòu)造函數(shù)只能返回一個(gè)參數(shù),它是本類(lèi)的一個(gè)對(duì)象,在類(lèi)的所有方法中只能用構(gòu)造函數(shù)來(lái)創(chuàng)立一個(gè)對(duì)象。3〕構(gòu)造函數(shù)總是返回一個(gè)有效的類(lèi)實(shí)例,而不是一個(gè)空對(duì)象。4〕如果類(lèi)中沒(méi)有說(shuō)明構(gòu)造函數(shù),那么MATLAB就會(huì)提供一個(gè)無(wú)輸入?yún)?shù)的構(gòu)造函數(shù)〔默認(rèn)構(gòu)造函數(shù)〕,并返回一個(gè)標(biāo)量對(duì)象,該對(duì)象中的屬性成員或被初始化為空〔[]〕,或按默認(rèn)值初始化。靜態(tài)方法類(lèi)型轉(zhuǎn)換方法3.4類(lèi)的組合內(nèi)嵌對(duì)象類(lèi)的優(yōu)先級(jí)問(wèn)題對(duì)象的保存與加載內(nèi)嵌對(duì)象實(shí)際上,類(lèi)的屬性成員中也可以存放另一個(gè)類(lèi)的實(shí)例。由此我們可以利用已有的類(lèi)的實(shí)例來(lái)構(gòu)建新的復(fù)雜的類(lèi)。
如果一個(gè)類(lèi)中的某屬性成員存放的是另一個(gè)類(lèi)的對(duì)象,我們?cè)谶@里將這樣的成員成為內(nèi)嵌對(duì)象。類(lèi)的優(yōu)先級(jí)問(wèn)題1〕不同類(lèi)之間包含同名函數(shù)時(shí)的優(yōu)先級(jí)問(wèn)題可以通過(guò)設(shè)置類(lèi)的優(yōu)先級(jí)來(lái)確定主導(dǎo)類(lèi)。MATLAB中確定類(lèi)之間的優(yōu)先級(jí)是通過(guò)設(shè)置一個(gè)類(lèi)的inferiorClass特性來(lái)實(shí)現(xiàn)的,其格式如下:classdef(InferiorClass={?class1,?class2,…}myClass…End這說(shuō)明class1、class2等的優(yōu)先級(jí)要低于myClass,即myClass相對(duì)于它們是主導(dǎo)類(lèi)。如果沒(méi)有指定類(lèi)的優(yōu)先級(jí),那么在默認(rèn)情況下,在調(diào)用這些類(lèi)的那個(gè)同名函數(shù)時(shí),輸入?yún)?shù)最左邊的對(duì)象是主導(dǎo)對(duì)象2〕同名類(lèi)之間的優(yōu)先級(jí)問(wèn)題對(duì)象的保存與加載像MATLAB的普通變量一樣可以用命令save將工作空間的對(duì)象保存在mat文件中;當(dāng)這個(gè)對(duì)象從工作空間刪除后,這個(gè)對(duì)象可以從保存文件中用命令load加載到工作空間中來(lái)。Save和load的使用格式是:savefilenameobjectLoadfilenameobject第4章MATLAB中的繼承與派生4.1類(lèi)的繼承與派生4.2派生類(lèi)的構(gòu)造函數(shù)4.3多重繼承的成員標(biāo)識(shí)問(wèn)題4.4指定容許派生的類(lèi)4.5類(lèi)成員的訪(fǎng)問(wèn)控制4.6定義MATLAB內(nèi)置類(lèi)型的派生類(lèi)4.1類(lèi)的繼承與派生繼承與派生的概念派生類(lèi)的定義派生形成過(guò)程用派生類(lèi)創(chuàng)立一個(gè)類(lèi)的別名繼承與派生的概念MATLAB中通過(guò)派生〔classderivation〕的機(jī)制來(lái)支持繼承。被繼承的類(lèi)型被稱(chēng)為基類(lèi)〔baseclass〕或超類(lèi)〔superclass〕,而新產(chǎn)生的類(lèi)那么為派生類(lèi)〔derivedclass〕或子類(lèi)〔subclass〕。派生類(lèi)的定義MATLAB中,派生類(lèi)的一般定義格式為:Classdef派生類(lèi)名<基類(lèi)名1&基類(lèi)名2&…&基類(lèi)名n
派生類(lèi)成員聲明;End其中基類(lèi)名1、基類(lèi)名2、…、基類(lèi)名n是已聲明的類(lèi)。如果一個(gè)派生類(lèi)同時(shí)有多個(gè)基類(lèi),那么這種情況稱(chēng)為多重繼承〔multiple-inherit〕,這時(shí)的派生類(lèi)同時(shí)得到了多個(gè)已有類(lèi)的特征。如果一個(gè)派生類(lèi)只有一個(gè)直接基類(lèi),這種情況就稱(chēng)為單繼承〔single-inherit〕直接參與派生出某類(lèi)的基類(lèi)稱(chēng)為直接基類(lèi),而基類(lèi)的基類(lèi)以及更深層的基類(lèi)那么稱(chēng)為間接基類(lèi)。派生形成過(guò)程MATLAB生成一個(gè)派生類(lèi)的過(guò)程分為:1.吸收基類(lèi)成員:MATLAB的派生類(lèi)實(shí)際上吸收了所有的基類(lèi)成員〔注:基類(lèi)的私有成員和構(gòu)造函數(shù)不會(huì)顯式地出現(xiàn)在派生類(lèi)中〕。2.改造基類(lèi)成員:如果派生類(lèi)聲明了一個(gè)與基類(lèi)同名的成員,派生類(lèi)中的成員就屏蔽了基類(lèi)的同名成員。這就是所謂的同名覆蓋。同名覆蓋包含屬性成員的同名覆蓋和方法的同名覆蓋。其中,屬性成員的同名覆蓋是有條件的:1〕.基類(lèi)屬性成員的abstract特性是true〔即該屬性成員是抽象的〕。2〕.基類(lèi)屬性成員的SetAcces和GetAccess特性是private。3.開(kāi)展新成員:新成員必須與基類(lèi)成員不同名。4.重寫(xiě)構(gòu)造函數(shù)在派生類(lèi)生成過(guò)程中,派生類(lèi)不會(huì)將基類(lèi)的類(lèi)定義方面的相關(guān)屬性繼承過(guò)來(lái)。用派生類(lèi)創(chuàng)立一個(gè)類(lèi)的別名創(chuàng)立一個(gè)類(lèi)的別名,可以通過(guò)建立一個(gè)空的派生類(lèi)來(lái)實(shí)現(xiàn)classdefNewClassName<OldClassNameend這里類(lèi)OldClassName是已有的類(lèi),類(lèi)NewClassName就是類(lèi)OldName的別名。注意:如果原來(lái)類(lèi)中的構(gòu)造函數(shù)支持帶無(wú)參數(shù)輸入形式,那么就可以用類(lèi)似上面定義的空的派生形式創(chuàng)立別名類(lèi)。如果原來(lái)類(lèi)的構(gòu)造函數(shù)不支持無(wú)參數(shù)輸入,那么別名類(lèi)中就要求增加一個(gè)構(gòu)造函數(shù)。4.2派生類(lèi)的構(gòu)造函數(shù)構(gòu)造函數(shù)的建立派生類(lèi)構(gòu)造函數(shù)執(zhí)行的順序構(gòu)造函數(shù)的建立派生類(lèi)構(gòu)造函數(shù)的輸入?yún)?shù)設(shè)計(jì)就應(yīng)考慮到基類(lèi)數(shù)據(jù)成員和新增數(shù)據(jù)成員,其中一局部參數(shù)要傳遞給基類(lèi)數(shù)據(jù)成員,而另一局部要傳遞給新增數(shù)據(jù)成員。派生類(lèi)的構(gòu)造函數(shù)的一般定義形式為:派生類(lèi)的構(gòu)造函數(shù)的一般定義形式為:Function對(duì)象名=派生類(lèi)名〔參數(shù)總表〕對(duì)象名=對(duì)象名@基類(lèi)名1〔參數(shù)表1〕;%@后面局部可看成基類(lèi)1的構(gòu)造對(duì)象名=對(duì)象名@基類(lèi)名1〔參數(shù)表1〕;%函數(shù)…對(duì)象名=對(duì)象名@基類(lèi)名1〔參數(shù)表1〕;對(duì)象名.新增屬性成員1=參數(shù)1;…對(duì)象名.新增屬性成員M=參數(shù)M;end使用派生類(lèi)構(gòu)造函數(shù)的本卷須知1.如果在調(diào)用派生類(lèi)的構(gòu)造函數(shù)時(shí),需要將參數(shù)傳給基類(lèi)成員,那么在派生類(lèi)構(gòu)造函數(shù)中要顯式地調(diào)用這些基類(lèi)的構(gòu)造函數(shù),否那么MATLAB會(huì)隱式調(diào)用。2.如果在派生類(lèi)構(gòu)造函數(shù)中要顯式地調(diào)用基類(lèi)構(gòu)造函數(shù),那么這樣的調(diào)用應(yīng)在創(chuàng)立的對(duì)象引用之前來(lái)完成。3.一個(gè)派生類(lèi)也可以不編寫(xiě)構(gòu)造函數(shù),除非它的基類(lèi)的構(gòu)造函數(shù)是帶輸入?yún)?shù)的。派生類(lèi)構(gòu)造函數(shù)執(zhí)行的順序繼承順序ClassC(子類(lèi))ClassBClassA(基類(lèi))調(diào)用順序調(diào)用ClassC的構(gòu)造函數(shù)調(diào)用ClassB的構(gòu)造函數(shù)調(diào)用ClassA的構(gòu)造函數(shù)4.3多重繼承中的成員標(biāo)識(shí)問(wèn)題屬性成員名稱(chēng)沖突方法名稱(chēng)沖突事件名稱(chēng)沖突在MATLAB面向?qū)ο蟪绦蛟O(shè)計(jì)中,多重繼承一般不支持各個(gè)基類(lèi)中帶有同名成員,但在一些特殊條件下允許出現(xiàn)同名成員。4.4指定容許派生的類(lèi)4.5類(lèi)成員的訪(fǎng)問(wèn)控制屬性成員的訪(fǎng)問(wèn)控制方法的訪(fǎng)問(wèn)控制事件的訪(fǎng)問(wèn)控制4.6定義MATLAB內(nèi)置類(lèi)型的派生控制的內(nèi)置類(lèi)定義MATLAB內(nèi)置類(lèi)的派生類(lèi)第5章handle類(lèi)型5.1handle類(lèi)型的聲明5.2類(lèi)handle的介紹5.3屬性成員get/set接口的實(shí)現(xiàn)5.4動(dòng)態(tài)屬性成員的實(shí)現(xiàn)5.5handle類(lèi)型的析構(gòu)函數(shù)5.6handle兼容類(lèi)5.7深拷貝與淺拷貝有時(shí)我們希望給對(duì)象創(chuàng)立一個(gè)引用,而不希望復(fù)制這個(gè)對(duì)象的數(shù)據(jù),這時(shí)就可以使用handle型類(lèi)了。5.1handle類(lèi)型的聲明Handle型類(lèi)聲明形式與value型類(lèi)聲明形式的根本不同之處是前者必須是類(lèi)handle的派生類(lèi),而后者不是。類(lèi)handle是MATLAB中已聲明的一個(gè)抽象類(lèi)。聲明一個(gè)handle型類(lèi)的格式是:Classdef類(lèi)名<handle…endHandle型類(lèi)的派生類(lèi)也是handle型類(lèi)。這時(shí),我們不需要在handle型派生類(lèi)中再次將handle指明為基類(lèi)。聲明了一個(gè)handle型類(lèi)之后就可以創(chuàng)立handle型類(lèi)對(duì)象了,handle型類(lèi)的對(duì)象簡(jiǎn)稱(chēng)為handle對(duì)象。創(chuàng)立handle對(duì)象形式和value型類(lèi)是相同的,不同的是:創(chuàng)立handle對(duì)象時(shí),構(gòu)造函數(shù)返回的不是被創(chuàng)立的對(duì)象,而是這個(gè)對(duì)象的句柄。MATLAB中的一個(gè)句柄也是一個(gè)變量,它是一個(gè)類(lèi)實(shí)例的唯一標(biāo)識(shí)。當(dāng)我們復(fù)制一個(gè)句柄對(duì)象時(shí),MATLAB復(fù)制的是句柄,不會(huì)復(fù)制這個(gè)對(duì)象中的數(shù)據(jù)。這個(gè)被復(fù)制的句柄引用的數(shù)據(jù)與原來(lái)的句柄引用的數(shù)據(jù)是一致的。除自定義的handle型類(lèi)外,MATLAB中的句柄圖形〔handlegraphics)類(lèi)型的行為特征也類(lèi)似于handle型類(lèi)。MATLAB在創(chuàng)立每個(gè)圖形對(duì)象時(shí)都為對(duì)象分配唯一的一個(gè)值,稱(chēng)為圖形對(duì)象句柄〔handle〕。句柄是圖形對(duì)象的唯一標(biāo)識(shí)符。句柄圖形型類(lèi)創(chuàng)立的對(duì)象就是MATLAB的圖形對(duì)象,句柄圖形型類(lèi)創(chuàng)立一個(gè)對(duì)象時(shí)返回一個(gè)已創(chuàng)立對(duì)象的句柄。Handle型類(lèi)可以通過(guò)句柄復(fù)制來(lái)實(shí)現(xiàn)對(duì)象的引用功能,除此之外,handle類(lèi)型還具有如下一些特征:〔1〕.繼承類(lèi)handle的方法;〔2〕.能夠定義事件和聽(tīng)眾;〔3〕.定義動(dòng)態(tài)屬性成員;〔4〕實(shí)現(xiàn)句柄圖形類(lèi)型的get和set方法。5.2類(lèi)handle的介紹類(lèi)handle是MATLAB內(nèi)定義的一個(gè)抽象類(lèi)。所謂抽象類(lèi)就是只能作為基類(lèi),而不能直接用它定義對(duì)象。類(lèi)handle是定義所有handle型類(lèi)的基類(lèi),即要定義一個(gè)handle型類(lèi)應(yīng)該以類(lèi)handle為基類(lèi),或以handle型類(lèi)為基類(lèi)。類(lèi)handle中沒(méi)有提供屬性成員,而提供了許多有用的方法,定義一個(gè)handle型類(lèi)將繼承這些方法,這些方法的名稱(chēng)和功能如下:5.3屬性成員get/set接口的實(shí)現(xiàn)在定義一些具有特殊要求的handle型類(lèi)時(shí),還可以用MATLAB中提供的兩個(gè)handle型類(lèi)作為基類(lèi)。這兩個(gè)類(lèi)分別是類(lèi)hgsetget和類(lèi)dynamicprops,前者提供了set和get方法,使其能夠?qū)崿F(xiàn)句柄圖形〔handlegraphics〕類(lèi)型的標(biāo)準(zhǔn)接口風(fēng)格,后者提供了能夠?qū)崿F(xiàn)動(dòng)態(tài)屬性成員的功能。這兩個(gè)handle型類(lèi)也是抽象類(lèi),不能直接定義對(duì)象。MATLAB中標(biāo)準(zhǔn)的句柄圖形系統(tǒng)實(shí)現(xiàn)了基于set和get方法的一個(gè)接口〔注:這里的兩個(gè)方法有別于屬性成員中的set和get方法〕,利用這些方法我們可以設(shè)置和查詢(xún)圖形對(duì)象的屬性值。Hgsetget類(lèi)是handle的派生類(lèi),這個(gè)類(lèi)實(shí)現(xiàn)這些方法的實(shí)現(xiàn)過(guò)程。我們以hgsetget類(lèi)為基類(lèi)聲明的handle型類(lèi)就可以繼承這些功能,這樣的類(lèi)就是一個(gè)set/get接口類(lèi)。與屬性成員的set和get方法調(diào)用方式不同,hesetget類(lèi)的set/get接口方法調(diào)用既可以按在對(duì)象上用操作符“.”引用屬性成員的方式進(jìn)行設(shè)置和查詢(xún),也可以直接按普通函數(shù)的方式調(diào)用,如:V=get(h,’PropertyName’);或V=h.PropertyName;這里v返回句柄對(duì)象h中成員PropertyName的值。set〔h,’PropertyName’,PropertyValue);或h.PropertyName=PropertyValue;就是將句柄對(duì)象h中的成員PropertyName的值設(shè)置為PropertyValue。5.4動(dòng)態(tài)屬性成員的實(shí)現(xiàn)有時(shí)在使用這些同一個(gè)類(lèi)的對(duì)象時(shí),希望個(gè)別對(duì)象上附加上一些臨時(shí)的數(shù)據(jù),這些數(shù)據(jù)有別于其他對(duì)象的屬性成員,而這些成員不用在類(lèi)聲明中提前給出,這些成員就是動(dòng)態(tài)屬性成員。在MATLAB中可以通過(guò)類(lèi)dynamicprops的派生類(lèi)來(lái)實(shí)現(xiàn)這種功能。類(lèi)dynamicprops是MATLAB內(nèi)定義的handle型抽象類(lèi),它提供了能夠?qū)崿F(xiàn)動(dòng)態(tài)屬性成員的功能。類(lèi)dynamicprops除繼承類(lèi)handle的所有方法外,還增加了一個(gè)addprop方法,它的功能是向一個(gè)句柄對(duì)象添加一個(gè)屬性成員的名稱(chēng),其使用格式如下:
P=addprop(H,’PropertyName’)這里P是meta.DynamicProperty對(duì)象數(shù)組,H是一個(gè)句柄數(shù)組,PropertyName是要附加給這些對(duì)象的動(dòng)態(tài)屬性成員名稱(chēng)。在對(duì)象上添加動(dòng)態(tài)屬性成員時(shí),動(dòng)態(tài)屬性成員名稱(chēng)除應(yīng)遵循具有一般變量的命名規(guī)那么外,還應(yīng)注意:1〕.不能與這個(gè)類(lèi)中的方法同名;2〕.不能與這個(gè)類(lèi)中的事件同名;3〕.名稱(chēng)中不能包含操作符“.”;例如定義一個(gè)dynamicprops的派生類(lèi):classdefMyButton<dynamicpropspropertiesUiHandleend
methodsfunctionobj=MyButton(pos)%構(gòu)造函數(shù),%名稱(chēng)與類(lèi)名一致,注意大小寫(xiě)
ifnargin>0iflength(pos)==4
obj.UiHandle=uicontrol('Position',pos,...'Style','pushbutton');elseerror('Improperposition')endendendendend>>hbutton1=MyButton([20,40,100,40]);%創(chuàng)立對(duì)象>>addprop(hbutton1,‘Caption’);%添加動(dòng)態(tài)屬性成員>>hbutton1.Caption=‘OK’;%給成員Caption賦值>>set(hbutton1.UiHandle,‘string’,hbutton1.Caption);%給定制的按鈕加標(biāo)題在對(duì)一個(gè)對(duì)象上增加了動(dòng)態(tài)屬性成員之后就可以像普通屬性成員一樣來(lái)使用了:1.可以通過(guò)對(duì)象用點(diǎn)操作符來(lái)設(shè)置和查詢(xún)?cè)摮蓡T;2.當(dāng)保存和加載對(duì)象時(shí),MATLAB也會(huì)把動(dòng)態(tài)屬性成員進(jìn)行保存和加載。3.可以為動(dòng)態(tài)屬性成員定義特性。4.可以為動(dòng)態(tài)屬性成員編寫(xiě)set和get函數(shù);5.可以聽(tīng)到動(dòng)態(tài)屬性成員引發(fā)的事件;6.通過(guò)對(duì)象數(shù)組訪(fǎng)問(wèn)動(dòng)態(tài)屬性成員的值。為這個(gè)動(dòng)態(tài)屬性成員設(shè)置相應(yīng)的特性,其方法是通過(guò)addprop返回值中的meta.DynamicProperty對(duì)象來(lái)設(shè)置,如:>>p1=addprop(hbutton1,‘Caption’);%添加動(dòng)態(tài)屬性成員Caption>>hbutton1.Caption=‘OK’;%給成員Caption賦值>>p1.Constant=true;%設(shè)置成員Caption的特性可以為動(dòng)態(tài)屬性成員編寫(xiě)自己的get和set函數(shù)。實(shí)現(xiàn)動(dòng)態(tài)屬性成員的set和get函數(shù)步驟是:1.定義一個(gè)函數(shù)來(lái)完成動(dòng)態(tài)屬性成員進(jìn)行設(shè)置和查詢(xún)之前希望完成的工作,其格式為myset(obj,val)或val=myGet(obj);2.獲得動(dòng)態(tài)屬性成員對(duì)應(yīng)的meta.DynamicProperty對(duì)象;3.將我們定義好的動(dòng)態(tài)屬性成員設(shè)置或查詢(xún)函數(shù)句柄指派到meta.DynamicProperty對(duì)象的GetMethod或SetMethod成員上。我們定義的這個(gè)函數(shù)不必是這個(gè)類(lèi)的方法,這時(shí)我們不能用類(lèi)似set.PropertyName這種形式的函數(shù)名。使用dynamicprops作為基類(lèi),我們就可以在該派生類(lèi)對(duì)象上動(dòng)態(tài)地添加屬性成員。此外這些動(dòng)態(tài)屬性成員還可以產(chǎn)生一些事件。5.5handle型類(lèi)的析構(gòu)函數(shù)MATLAB創(chuàng)立一個(gè)對(duì)象是通過(guò)構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)的,當(dāng)一個(gè)對(duì)象的生命周期即將結(jié)束時(shí),MATLAB會(huì)自動(dòng)地去調(diào)用一個(gè)特殊的方法進(jìn)行善后工作,這個(gè)特殊的方法就是析構(gòu)函數(shù)〔destructor〕。在handle型類(lèi)中析構(gòu)函數(shù)的主要特征是函數(shù)名必須是delete,并以普通方法形式定義。除此之外,必須具備如下條件MATLAB才會(huì)把delete方法當(dāng)作一個(gè)有效的析構(gòu)函數(shù):1.delete方法必須有一個(gè)標(biāo)量輸入,即本類(lèi)對(duì)象;2.不帶輸出參數(shù);3.不能是密封的方法、靜態(tài)的方法或抽象方法,即方法的特性不能是Sealed,Static或Abstract。聲明一個(gè)析構(gòu)函數(shù)的方法的一般格式:Methods
functiondelete(obj)%析構(gòu)函數(shù),obj是一個(gè)本類(lèi)對(duì)象
…
endEnd如果一個(gè)類(lèi)的析構(gòu)函數(shù)不必做其他工作,我們也不用在類(lèi)中顯式地重寫(xiě)一個(gè)析構(gòu)函數(shù),這是因?yàn)轭?lèi)handle中已定義了一個(gè)析構(gòu)函數(shù)delete,因此這個(gè)析構(gòu)函數(shù)也被繼承過(guò)來(lái)了。5.6handle-兼容類(lèi)Handle型類(lèi)和value型類(lèi)可以在同一場(chǎng)合下使用,這時(shí)就需要涉及到handle型類(lèi)與value型類(lèi)的兼容性問(wèn)題。如果一個(gè)類(lèi)可以和handle型類(lèi)進(jìn)行組合構(gòu)成基類(lèi)來(lái)創(chuàng)立派生類(lèi),那么這樣的類(lèi)就稱(chēng)為handle-兼容類(lèi)。所有的handle型類(lèi)都是handle兼容的。Handle-兼容類(lèi)遵循如下規(guī)那么:1.handle-兼容類(lèi)的所有基類(lèi)必須是handle-兼容類(lèi);2.如果在一個(gè)類(lèi)定義明確了HandleCompatible特性值為false,那么該類(lèi)的所有基類(lèi)中就不能有handle型類(lèi);3.如果在一個(gè)類(lèi)聲明沒(méi)有明確設(shè)置HandleCompatible特性,而有一個(gè)基類(lèi)是handle型類(lèi),那么所有的基類(lèi)都必須是handle-兼容的;4.特性HandleCompatible不能被繼承。Value型類(lèi)、handle型類(lèi)與handle-兼容類(lèi)關(guān)系圖Handle型類(lèi)Handle-兼容類(lèi)Value型類(lèi)繼承關(guān)系Handle-兼容類(lèi)Handle型類(lèi)Value型handle-兼容類(lèi)基類(lèi):Handle型類(lèi)非handle兼容類(lèi)派生類(lèi):繼承于繼承于一個(gè)handle兼容類(lèi)說(shuō)明它可以和handle型類(lèi)進(jìn)行組合構(gòu)成基類(lèi)來(lái)創(chuàng)立派生類(lèi)。當(dāng)我們?cè)诙x抽象基類(lèi)時(shí),handle-兼容類(lèi)提供了很大的靈活性,如在設(shè)計(jì)一個(gè)接口類(lèi)時(shí),基類(lèi)可以被設(shè)計(jì)成既支持handle型派生類(lèi),又支持value型派生類(lèi)。Handle-兼容類(lèi)可到達(dá)一物兩用的效果。在設(shè)計(jì)handle-兼容類(lèi)的方法時(shí),需要兼顧到傳參給方法的參數(shù)可能是handle型對(duì)象也可能是value型對(duì)象。在調(diào)用時(shí)應(yīng)考慮到會(huì)有兩種不同的行為:1〕.如果是以handle型對(duì)象為方法的輸入?yún)?shù),那么執(zhí)行方法會(huì)改變handle型對(duì)象,這種改變對(duì)所有工作空間中的同名句柄都生效。2〕.如果是以value型對(duì)象為方法的輸入?yún)?shù),那么執(zhí)行方法僅會(huì)改變方法空間內(nèi)部的對(duì)象。因此,如果handle-兼容類(lèi)的一個(gè)方法既要操作handle型對(duì)象,又要操作value型對(duì)象,那么這個(gè)方法就應(yīng)返回一個(gè)修改的對(duì)象。5.7深拷貝與淺拷貝深拷貝與淺拷貝的概念類(lèi)簡(jiǎn)介深拷貝的實(shí)現(xiàn)深拷貝與淺拷貝的概念當(dāng)a、b為value型類(lèi)的對(duì)象時(shí),將A復(fù)制給b后,改變對(duì)象B的屬性的值不會(huì)對(duì)對(duì)象A的對(duì)應(yīng)屬性的值產(chǎn)生影響。這種value型對(duì)象的復(fù)制就叫做深拷貝。當(dāng)a、b為handle型類(lèi)的對(duì)象時(shí),將A復(fù)制給b后,改變對(duì)象B的屬性的值會(huì)對(duì)對(duì)象A的對(duì)應(yīng)屬性的值產(chǎn)生影響,a、b在數(shù)據(jù)上不是完全獨(dú)立的兩個(gè)單元。這種handle型對(duì)象的復(fù)制就叫做淺拷貝。Handle型類(lèi)對(duì)象之間進(jìn)行復(fù)制時(shí),一般是淺拷貝。那么這種對(duì)象之間能否實(shí)現(xiàn)深拷貝呢?類(lèi)簡(jiǎn)介5.7.3深拷貝的實(shí)現(xiàn)第6章對(duì)象陣列6.1MATLAB中常用的陣列形式6.2創(chuàng)立對(duì)象陣列6.3不同類(lèi)型對(duì)象組成的陣列6.4多對(duì)象陣列6.1MATLAB中常用的陣列形式6.1MATLAB中常用的陣列形式6.2創(chuàng)立對(duì)象陣列6.3不同類(lèi)型對(duì)象組成對(duì)象陣列6.4多對(duì)象陣列6.1.1陣列的概念6.1.2幾種常用的陣列1.數(shù)值陣列2.字符陣列3.邏輯陣列4.元胞陣列5.結(jié)構(gòu)體陣列6.函數(shù)句柄陣列單元陣列是matlab中特殊一種數(shù)組,它的元素被稱(chēng)為單元〔cells〕,它可以存儲(chǔ)其它類(lèi)型的matlab數(shù)組。例如,一個(gè)單元陣列的一個(gè)單元可能包含一個(gè)實(shí)數(shù)數(shù)組或字符型數(shù)組,還可能是復(fù)數(shù)組〔圖7.1所示〕在一個(gè)編程工程中,一個(gè)單元陣列的每一個(gè)元素都是一個(gè)指針,指向其他的數(shù)據(jù)結(jié)構(gòu),而這些數(shù)據(jù)結(jié)構(gòu)可以是不同的數(shù)據(jù)類(lèi)型。單元陣列為選擇問(wèn)題信息提供極好的方示,因?yàn)樗行畔⒍季奂谝黄?,并可以通邊一單個(gè)名字訪(fǎng)問(wèn)。單元陣列用大括號(hào){}替代小括號(hào)來(lái)選擇和顯示單元的內(nèi)容。這個(gè)不同是由于單元的內(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)的含義為顯示這個(gè)單元的內(nèi)容,它是一個(gè)數(shù)據(jù)結(jié)構(gòu)。6.2創(chuàng)立對(duì)象陣列如何創(chuàng)立對(duì)象陣列在對(duì)象陣列上添加動(dòng)態(tài)屬性成員陣列不僅可以由根本數(shù)據(jù)類(lèi)型組成,也可以由類(lèi)的多個(gè)實(shí)例構(gòu)成。對(duì)象陣列〔objectarrays〕的元素是類(lèi)的實(shí)例,不僅具有數(shù)據(jù)成員,還有操作這些數(shù)據(jù)的方法。因此對(duì)象陣列具有一定的特殊之處。在MATLAB面向?qū)ο蟪绦蛟O(shè)計(jì)中,一個(gè)對(duì)象陣列的所有元素可以源自同類(lèi)型的實(shí)例,也可以不是。如何創(chuàng)立對(duì)象陣列1〕比較常用的方法是使用循環(huán)語(yǔ)句依次對(duì)陣列中每個(gè)元素用對(duì)象來(lái)初始化,例如下面的循環(huán)語(yǔ)句創(chuàng)立了一個(gè)2*3對(duì)象陣列A:fori=1:2forj=1:3A(i,j)=Myclass(i+j);endend這里Myclass是一個(gè)類(lèi)。2〕用下標(biāo)索賦值的方式,同時(shí)通過(guò)對(duì)陣列最后一個(gè)元素的賦值來(lái)創(chuàng)立對(duì)象陣列。例如我們聲明一個(gè)類(lèi):classdefSimpleClassPropertiesValueendmethodsfunctionobj=simpleClass(v)ifnargin>0%支持無(wú)參數(shù)輸入obj.Value=val;endendendend
定義一個(gè)對(duì)象a:a=SimpleClass(6);再用該對(duì)象初始化陣列的最后一個(gè)元素:A〔2,3〕=a;這樣A就是一個(gè)2*3的對(duì)象陣列了,也可以直接通過(guò)調(diào)用SimpleClass的構(gòu)造函數(shù)來(lái)初始化陣列A,即:A〔2,3〕=SimpleClass〔6〕此時(shí)對(duì)象陣列的沒(méi)一個(gè)對(duì)象都初始化了。而對(duì)象陣列A中的最后一個(gè)元素是帶參數(shù)輸入的構(gòu)造函數(shù)創(chuàng)立的對(duì)象,而其余元素是無(wú)參數(shù)輸入情況下構(gòu)造函數(shù)創(chuàng)立的對(duì)象。因此在這種方式創(chuàng)立對(duì)象陣列時(shí),類(lèi)構(gòu)造函數(shù)要支持無(wú)參數(shù)輸入的情況〔即標(biāo)*的語(yǔ)句〕,否那么會(huì)提示錯(cuò)誤。3〕在一個(gè)類(lèi)的構(gòu)造函數(shù)實(shí)現(xiàn)局部構(gòu)建對(duì)象陣列。這時(shí)構(gòu)造函數(shù)的返回值就是應(yīng)是一個(gè)對(duì)象陣列。例如,下面類(lèi)的構(gòu)造函數(shù)中就實(shí)現(xiàn)了這種過(guò)程。ClassdefArrayClassPropertiesData;endmethodsfunctionobj=ArrayClass(Matrix)ifnargin~=0;[m,n]=size(Matrix);
obj(m,n)=ArrayClass;%預(yù)分配對(duì)象空間陣列
fori=1:mforj=1:nobj(I,j).Data=Maxtrix(i,j);EndEndEndEndEndEnd在上面類(lèi)的構(gòu)造函數(shù)中,首先為對(duì)象陣列的每個(gè)元素預(yù)分配空間,在這個(gè)過(guò)程中MATLAB首先對(duì)最后一個(gè)元素用左端的對(duì)象進(jìn)行賦值,然后依次用默認(rèn)ArrayClass對(duì)象〔無(wú)參數(shù)輸入情況下構(gòu)建的對(duì)象〕來(lái)填充,從第一個(gè)元素到倒數(shù)第二個(gè)元素。預(yù)分配陣列對(duì)象之后,就為每個(gè)元素對(duì)象的data依次用輸入矩陣matrix的對(duì)應(yīng)元素賦值。例如:>>M=magic(5);%創(chuàng)立5階魔方矩陣>>c=ArrayClass(M)%創(chuàng)立5*5對(duì)象陣列〔4〕通過(guò)空陣列來(lái)創(chuàng)立對(duì)象陣列。沒(méi)有元素的陣列就是一個(gè)空陣列,但它有確定的類(lèi)型。所有的非抽象類(lèi)都具有一個(gè)靜態(tài)方法empty,它的任務(wù)是創(chuàng)立一個(gè)同類(lèi)型的空陣列。Empty方法能夠使我們指定輸出陣列的維數(shù),但必須要使某一維為0,例如:>>E=SimpleClass.empty(4,0);創(chuàng)立了一個(gè)4*0的SimpleClass型空陣列。當(dāng)無(wú)輸入?yún)?shù)時(shí),創(chuàng)立的0*0的空陣列。如果我們給屬性成員賦值,那么MATLAB會(huì)調(diào)用SimpleClass的構(gòu)造函數(shù)來(lái)擴(kuò)展出一個(gè)指定大小的陣列:>>E(4,6).value=7>>EE=4x6SimpleClassProperties:value這里擴(kuò)展出了一個(gè)4x6的對(duì)象陣列E。在這種情況下,MATLAB用SimpleClass無(wú)參構(gòu)造函數(shù)創(chuàng)立的對(duì)象來(lái)填充除第4行第6列以外的所有元素。然后,MATLAB把數(shù)值7賦值到對(duì)象E(4,6)的屬性成員Value上。
如果一個(gè)對(duì)象陣列中的元素是由handle型對(duì)象構(gòu)成的,那么在初始化這些對(duì)象時(shí)有些特殊之處。在用handle型對(duì)象擴(kuò)展一個(gè)對(duì)象陣列時(shí),MATLAB僅調(diào)用類(lèi)的構(gòu)造函數(shù)一次,然后為陣列中的每個(gè)元素創(chuàng)立唯一的句柄,這時(shí)MATLAB不調(diào)用構(gòu)造函數(shù),而從已創(chuàng)立的對(duì)象復(fù)制屬性成員的值給其余的元素。6.3不同類(lèi)型對(duì)象組成的陣列6.4多對(duì)象陣列第7章多態(tài)性7.1函數(shù)重載7.2運(yùn)載符重載7.3抽象類(lèi)7.1函數(shù)重載7.2運(yùn)算符重載7.3抽象類(lèi)第8章事件與聽(tīng)眾8.1事件與聽(tīng)眾的概念8.2定義事件和聽(tīng)眾8.3屬性成員事件的收聽(tīng)8.4動(dòng)態(tài)屬性成員事件響應(yīng)8.1事件和聽(tīng)眾的概念事件的概念及事件模型聽(tīng)眾的概念事件的概念及事件模型
什么是事件呢?
事件的含義很廣泛。一般來(lái)說(shuō),從程序上可探測(cè)到的任何動(dòng)作,都能夠產(chǎn)生相應(yīng)的事件,并可以將該事件的發(fā)生告知其他對(duì)象,來(lái)實(shí)現(xiàn)對(duì)象之間的通信。這里的事件是用來(lái)標(biāo)識(shí)發(fā)生的某件事情的。在MATLAB面向?qū)ο蟪绦蛟O(shè)計(jì)中,事件表示發(fā)生在類(lèi)實(shí)例〔對(duì)象〕中的某些變化或行為,這些變化包括:〔1〕對(duì)類(lèi)〔對(duì)象〕中的數(shù)據(jù)的修改;〔2〕方法的執(zhí)行;〔3〕查詢(xún)或設(shè)置一個(gè)屬性成員值;〔4〕析構(gòu)一個(gè)對(duì)象。在MATLAB中,事件驅(qū)動(dòng)和事件響應(yīng)過(guò)程構(gòu)成了一個(gè)完整的事件模型。組織一個(gè)事件模型的一般步驟如下?!?〕命名事件:在一個(gè)handle型類(lèi)中聲明一個(gè)標(biāo)識(shí)符來(lái)代表事件,這個(gè)類(lèi)就是產(chǎn)生事件的類(lèi),簡(jiǎn)稱(chēng)事件類(lèi),相應(yīng)的實(shí)例稱(chēng)為事件對(duì)象;〔2〕創(chuàng)立聽(tīng)眾:在一個(gè)類(lèi)中聲明事件后,就可以關(guān)聯(lián)一個(gè)聽(tīng)眾,一般用addlistener函數(shù)來(lái)定義聽(tīng)眾;〔3〕定義一個(gè)方法來(lái)確定何時(shí)觸發(fā)這個(gè)事件,并通過(guò)notify函數(shù)對(duì)聽(tīng)眾進(jìn)行播送來(lái)告之該事件的發(fā)生?!?〕定義回調(diào)函數(shù):當(dāng)聽(tīng)眾接受到某事件發(fā)生的信息時(shí),就會(huì)去執(zhí)行一個(gè)與之關(guān)聯(lián)的回調(diào)函數(shù),因此還要定義一個(gè)回調(diào)函數(shù)。在定義聽(tīng)眾時(shí),既可以將該聽(tīng)眾與產(chǎn)生事件的對(duì)象生命周期進(jìn)行綁定,也可以將其限制在聽(tīng)眾對(duì)象的生存期和作用范圍內(nèi)。聽(tīng)眾的概念在MATLAB中,聽(tīng)眾是用來(lái)接收事件發(fā)生消息的對(duì)象,是event.listener型類(lèi)的對(duì)象。在MATLAB面向?qū)ο蟪绦蛟O(shè)計(jì)中,定義一個(gè)聽(tīng)眾可以采用兩種方法:一種方法是使用handle類(lèi)中的addlistener函數(shù);另一種方法是直接調(diào)用event.listener類(lèi)的構(gòu)造函數(shù)。一旦聽(tīng)眾創(chuàng)立后,它會(huì)一直等待事件發(fā)生的消息,一旦關(guān)聯(lián)的事件發(fā)生了,聽(tīng)眾就會(huì)執(zhí)行一個(gè)回調(diào)函數(shù)。這里event.listener類(lèi)是handle的子類(lèi)。Property(屬性成員)Purpose(意義)Source事件對(duì)象元胞數(shù)組Event事件名Callback事件觸發(fā)時(shí)執(zhí)行的回調(diào)函數(shù)(這時(shí)需要將特性Enable設(shè)置為trueEnabled是否執(zhí)行回調(diào)函數(shù)的開(kāi)關(guān)(默認(rèn)值為true)Recursive回調(diào)函數(shù)是否遞歸調(diào)用8.2定義事件和聽(tīng)眾如何命名一個(gè)事件事件觸發(fā)和播送如何響應(yīng)事件〔聽(tīng)眾的定義〕聽(tīng)眾的幾種創(chuàng)立方式回調(diào)函數(shù)定義和調(diào)用如何命名一個(gè)事件
在MATLAB面向?qū)ο蟪绦蛟O(shè)計(jì)中,一個(gè)事件要用一個(gè)名稱(chēng)來(lái)標(biāo)識(shí)。在一個(gè)類(lèi)的events事件塊中聲明一個(gè)標(biāo)識(shí)符,便可定義該類(lèi)中的一個(gè)事件的標(biāo)識(shí),我們把這樣的標(biāo)識(shí)也稱(chēng)為事件,其格式如下:Classdef類(lèi)名<handle
…
events
事件名endEnd例如在下面Mclock中定義了一個(gè)事件Alarm,我們可以通過(guò)改變成員Enable的值來(lái)觸發(fā)這個(gè)事件。Classdef
Mclock<handle
properties
Enable=false;%是否啟動(dòng)endevents
Alarm%鬧鐘
endEnd事件觸發(fā)和播送
當(dāng)定義了事件的類(lèi)中某些成員滿(mǎn)足一定條件時(shí)〔屬性成員值被更新等〕,我們就說(shuō)這個(gè)事件觸發(fā)了或發(fā)生了。對(duì)于用戶(hù)自定義的事件〔即除preSet、PostSet、PreGet和PostGet事件以外的事件〕,觸發(fā)事件的條件是需要程序員根據(jù)需要來(lái)設(shè)置的,然后調(diào)用handle類(lèi)中的方法notify來(lái)播送這個(gè)事件已發(fā)生的消息。所有的聽(tīng)眾對(duì)象將等待播送的消息,如果事件與聽(tīng)眾注冊(cè)的事件相匹配,將作出相應(yīng)的動(dòng)作。這里notify函數(shù)的原型如下:
notify〔Hobj,’EventName’)或notify(Hobj,’EventName’,data)上述notify函數(shù)的第一個(gè)參數(shù)Hobj表示事件定義的對(duì)象句柄,這里也可以是對(duì)象句柄的數(shù)組;第二個(gè)參數(shù)就是這個(gè)對(duì)象中的事件名稱(chēng);第三個(gè)參數(shù)data是封裝了有關(guān)事件數(shù)據(jù)的event.EventData對(duì)象。例如我們想通過(guò)ToggleButton類(lèi)中State的值的改變來(lái)觸發(fā)事件ToggledState的發(fā)生,從而來(lái)通知所有的聽(tīng)眾。這就需要在該類(lèi)中添加一個(gè)觸發(fā)事件的方法來(lái)調(diào)用notify函數(shù),具體方法如下:classdefToggleButton<handlepropertiesState=falseEndeventsToggledStateendmethods...functionOnStateChange(obj,newState)%CallthismethodtocheckforstatechangeifnewState~=obj.Stateobj.State=newState;Notify(obj,'ToggledState');%Broadcastnoticeofeventendendendend如何響應(yīng)事件〔聽(tīng)眾的定義〕定義聽(tīng)眾的一般方法是用handle類(lèi)中的成員函數(shù)addlistener完成的。Addlistener函數(shù)的原型如下:Lh=addlistener(Hsource,’EventName’,callback)%(1)或lh=addlistener(Hsource,property,’EventName’,callback)%(2)這里第一個(gè)函數(shù)用來(lái)為指定的事件創(chuàng)立一個(gè)聽(tīng)眾,而第二個(gè)函數(shù)用來(lái)為MATLAB中預(yù)定義的事件創(chuàng)立一個(gè)聽(tīng)眾。參數(shù)Hsource是發(fā)生事件的句柄,也可以是對(duì)象數(shù)組的句柄;參數(shù)EventName是Hsource所指對(duì)象中的事件名稱(chēng);參數(shù)callback是
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年低糖食品測(cè)試題及答案
- 2025年提高智商面試題及答案
- 2025年德威初中考試題及答案
- 2025年小學(xué)廚師考試題及答案
- 2025年特種工塔吊考試題及答案
- 2025年國(guó)家高壓電工試題及答案
- 2025年學(xué)校家庭測(cè)試題及答案
- 2025年士兵語(yǔ)音測(cè)試試題及答案
- 2025年危險(xiǎn)品充裝試題及答案
- 2025年跑力指數(shù)測(cè)試題及答案
- 2024年職業(yè)技能“大數(shù)據(jù)考試”專(zhuān)業(yè)技術(shù)人員繼續(xù)教育考試題庫(kù)與答案
- 2024秋季山西交控集團(tuán)所屬路橋集團(tuán)校園招聘270人公開(kāi)引進(jìn)高層次人才和急需緊缺人才筆試參考題庫(kù)(共500題)答案詳解版
- SYT 6680-2021 石油天然氣鉆采設(shè)備 鉆機(jī)和修井機(jī)出廠驗(yàn)收規(guī)范-PDF解密
- 華為供應(yīng)鏈管理崗位筆試題目含筆試技巧
- 2024年常州機(jī)電職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)及答案解析
- 任務(wù)4 聚酯縮聚生產(chǎn)操作-生產(chǎn)操作規(guī)程
- 湖南天壹名校聯(lián)盟2024年高二3月大聯(lián)考數(shù)學(xué)試題+答案
- 鐵路少年-練習(xí)及答案
- 2024年人教版小學(xué)語(yǔ)文六年級(jí)下冊(cè)第二單元測(cè)試卷(含答案解析)【可編輯打印】
- 統(tǒng)編版八年級(jí)語(yǔ)文下冊(cè) 24 唐詩(shī)三首練習(xí)題 (含答案)
- 混凝土抗壓強(qiáng)度統(tǒng)計(jì)評(píng)定表(自動(dòng)計(jì)算-數(shù)理-非數(shù)理)
評(píng)論
0/150
提交評(píng)論