A MATLAB objektum-orientált lehetőségei jelentősen eltérnek a megszokottól (C++). Az itt használatos fogalmak az egységbezárás, az öröklődés és az aggregáció.
Adatok és műveletek egységbezárása. Az objektumok adattagjai nem elérhetők a parancssorból, csak az osztályban definiált metódusokon keresztül.
Öröklődés. Ősökből és leszármazottakból álló osztály-hierarchiát építhetünk, ahol a leszármazottak őseik összes adattagjával és műveletével rendelkeznek. MATLAB-ban létezik egyszeres és többszörös öröklődés is.
Aggregáció. Létrehozhatunk osztályokat aggregációval is, ilyenkor az osztály objektumai más osztályok objektumait tartalmazzák. Ez akkor lehet hasznos, ha egy adattípus egy másik adattípus része.
Az összes MATLAB adattípus egyben osztály is a nyelvben. A 16 féle alapvető adattípus hierarchiáját láthatjuk az 1. ábrán. Lebegőpontos és egész számokból, karakterekből, sztringekből, logikai értékekből mátrixokat vagy tömböket építhetünk. Táblák, struktúrák, cellatömbök különböző típusú adatok tárolására szolgálnak. Függvény handle-k referenciák függvényre, összekapcsolják a hatókörön kívül eső kódokat.
1. ábra. A MATLAB osztályhierarchiája.
Megjegyzés: a kép
a Matlab
weboldaláról származik
Numerikus osztályok tartalmazzák az előjeles és előjel nélküli
egészeket, egyszeres és dupla pontos lebegőpontos
számokat. Alapértelmezetten a MATLAB minden numerikus értéket dupla
pontosságú lebegőpontos számábrázolásban tárol, ezen nem lehet
változtatni. (A MATLAB munkamenetben kötött változók osztályáról
a whos
paranccsal kaphatunk információt.)
Egy osztály definíciója általánosságban a következőképpen fest:
Az osztályt a nevével megegyező, .m kiterjesztésű fájlba kell menteni.
Objektumokat az osztály konstruktorának hívásával és a megfelelő paraméterek átadásával hozhatunk létre. A konstruktor neve megegyezik a tartalmazó osztály nevével, feladata az adattagok inicializálása. Megadni nem kötelező, kivéve ha az ősosztálynak konstruktora paramétereket vár.
Például a
utasítás a p nevű objektumot hozza létre, amely a polynom osztály egy példánya lesz. Most, hogy létezik az objektum, meghívhatjuk rá az osztály metódusait.
Egy osztály destruktora a delete
nevű metódus, melyet a
Matlab implicit módon meghív mielőtt kitörli a memóriából egy
példányát. Azonban ehhez a delete
metódusnak
teljesítenie kell néhány feltételt:
Sealed
, Static
vagy Abstract
A delete
metódus paramétere mindig
skalár. Értelemszerűen, ha egy tömb kerül felszámolásra, a Matlab
minden elemére külön-külön meghívja a destruktort.
Metódusok definiálhatók rögtön az osztálydefiníción belül, vagy egy külön fájlban. A következő példa az előbbit szemlélteti:
Fontos megjegyezni, hogy a nemstatikus metódusok paramétere között kötelezően szerepelnie kell az objektumnak, melyre meghívtuk a metódust. A MATLAB nyelv nem támogatja a C++-hoz hasonló implicit objektum referenciát.
A következő két variáció egyformán helyes a metódus meghívására,
ahol is obj
a fenti osztály egy példánya:
Ekkor a metódus attribútumok az adott methods
blokkon
belül definiált metódusokra érvényes.
A methods
parancs segítségével kilistázhatjuk egy adott
osztály összes metódusát.
Az osztály privát metódusait csak ugyanazon osztály metódusaiból hívhatjuk,
kívülről nem. Előfordulhat ugyanis, hogy szükség van egy metódusra
belső számítások elvégzésére, de nem akarjuk, hogy ez a metódus
része legyen az osztály publikus interfészének. Ebben az esetben
az Access
attribútum siet segítségünkre. A következő
értékek valamelyikét veheti fel:
Az érték osztály konstruktora visszaadja egy példányt, amely egy változóhoz lesz kötve. Ha ugyanezt a változót egy másik változónak adjuk értékül, a Matlab az eredeti objektumról másolatot hoz létre. Ha függvénynek adjuk át ezt a változót, mi, a hívók csak akkor veszünk észre változást az objektumon, ha a függvény visszaadja a módosított objektumot.
A handle osztály konstruktora visszaad egy handle objektumot (referenciát) a létrehozott objektumra. Ezt a referenciát aztán több változónak is értékül vagy függvénynek paraméterül adhatjuk anélkül, hogy a Matlab másolatot készítene az objektumról. Egy olyan függvénynek, mely módosítja az objektumot nem kell visszaadnia a módosított objektumot.
A saját osztályunk alapértelmezetten érték osztály. Ahhoz, hogy handle osztály lehessen belőle, az absztrakt handle ősosztálynak kell közvetett, vagy közvetlen leszármazottjának lennie.
A hibakeresés teljesen ugyanúgy működik, mint a közönséges M-fileok esetében, az egyetlen különbség, hogy a parancsok hívásakor az osztály nevének is szerepelnie kell, például:
dbstop @polynom/char
Hibakereséskor hozzáférhetünk az osztály összes metódusához, beleértve az örökölt és privát metódusokat, és a privát függvényeket is.
Osztálydefiníciók módosítása. Ha egy osztály mezőinek számát, nevét módosítjuk, ki kell adnunk a
clear classes
parancsot, hogy a MATLAB életbe léptesse a változásokat. Ez a parancs törli a workspace-t is. További részleteket lásd a clear parancsnál.
Először össze kell gyűjtenünk az osztály metódusait definiáló M-fileokat az osztály könyvtárába. Az osztály-könyvtár neve mindig @ karakterrel kezdődik. Az osztály konstruktora egy közönséges metódus, amely az osztály példányával tér vissza és a neve megegyezik az osztály nevével.
Ahhoz, hogy elérhetőek legyenek, az osztály-könyvtárakat tartalmazó könyvtáraknak szerepelniük kell a MATLAB keresési útvonalában.
/Maguknak az osztály-könyvtáraknak viszont nem kell szerepelniük a keresési útvonalban./
Az osztály-könyvtár hozzáadása a MATLAB keresési
útvonalához.
Ha osztályunkat külön fájlokban valósítjuk
meg, és elkészítettük osztályunk könyvtárát, hozzá kell adnunk a
MATLAB keresési útvonalához annak szülő könyvtárát, hogy a MATLAB
megtalálja a benne definiált metódusokat. Például ha
a polynom osztály könyvtára a
c:\myClasses\@polynom
akkor így adhatjuk hozzá a keresési útvonalhoz:
addpath c:\myClasses;
Több osztály-könyvtár együttes használata.
Használhatunk egy osztályhoz több osztály-könyvtárt is, azaz lehetnek
a filerendszerünkben több helyen is
@classname nevű alkönyvtárak, és ezek lehetnek egy
időben a MATLAB keresési útvonalában. Ilyenkor a MATLAB az összes
útvonalat végignézi ha egy metódust keres, és az első találatot fogja
használni.
A MATLAB objektum-orientáltsága számos dologban különbözik a C++, Java nyelvekben megszokottól:
Amikor egy MATLAB objektumot öröklődéssel hozunk létre, a gyerek rendelkezik a szülő összes mezőjével és metódusával. A szülő pedig elérhet minden olyan adattagot a gyerek objektumban amelyet tőle örököltek.
Amikor egy osztály egyetlen egy szülőtől örökli az attribútumait, egyszeres öröklődésről beszélünk. Mivel a gyerek a szülő minden adattagját és tagfüggvényét (privátakat kivéve) tartalmazza, így a szülő tagfüggvényeivel kezelhetjük a gyerek objektumokat is. Így több objektumot tudunk egységesen kezelni (polimorfizmus). Ugyanakkor a gyerek objektumok nem tudják közvetlenül elérni a szülő mezőit, csupán lekérdező függvények segítségével. Egy örökölt konstruktornak két fő jellemzője van MATLAB-ban:
Meghívja a szülő konstruktorát, hogy létrehozza az örökölt mezőket.
A class függvény hívása alig változik, és jól tükrözi a szülő és a gyerek osztályt is.
Példányosítani a konstruktor hívásával, illetve a class paranccsal lehet:
A fenti parancs hatására létrejön egy childObj nevű a parentObj-ból származó obejektumunk. A MATLAB automatikusan generál childObject.parentClassName nevű mezőt, amely a szülő objektumot tartalmazza. Ha a szülő szintén egy örökölt osztály, akkor a megfelelő adattagok a nagyszülőtől öröklődnek, és így tovább.
Többszörös öröklődés esetében a gyerek több szülőosztály mezőit és metódusait örökli. Ebben az esetben is támogatott a több generációs öröklés, vagyis szülő osztály is lehet, többszörös örökös.
A következő szintaxis használatos az objektum inicializálásakor a leszármazott osztály konstruktorában:
obj
a visszatérési értéke az aktuális
konstruktornak, SuperClass
,... az ősosztály
neve, args
az ősosztály konstruktorának argumentuma.
Mikor több ösztály leszármazottját hozzuk létre, a leszármazott örökli ősei adattagjait, metódusait, eseményeit. Fontos, hogy ha egy vagy több ősosztály is definiál adattagot, metódust vagy eseményt ugyanazon a néven, a MATLAB egyértelműen ki tudja választani, melyikre is gondoltunk, azaz figyelmet kell szentelni az osztályok kompatibilitására. Az esetleges összeférhetetlenséget nekünk kell feloldanunk.
Az operátor túlterhelés különbözik a C-ben és Adában
látottaktól. MATLAB-ban ugyanis minden operátorhoz tartozik egy név,
így például a '+' -hoz a plus. A túlterheléshez az adott osztály
methods
blokkjában kell definiálni a függvényt a
szükséges paraméterekkel. A következő táblázat a 3. fejezetben
felsorolt operátorok függvényneveit adja meg.
A fenti példában ha két MyClass objektumot (a
és b
) adunk össze (a + b
) akkor a fent
definiált plus
függvény fut le.
Tekintsük a következő kifejezést: objectA + objectB . Általában a MATLAB a kifejezés objektumainak egyenlő precedenciáját feltételezi és ilyenkor a legbaloldalibb elemhez tartozó metódust hívja meg, vagyis ebben az esetben az objectA-hoz tartozó összeadást. E szabály alól kivétel:
Ha a felhasználó által definiált osztályok saját precedenciával rendelkeznek a MATLAB beépített osztályai felett.
Ha a felhasználói osztályok között relatív precedenciát definiálunk, az inferiroto és superiroto függvényekkel.