A MATLAB programozási nyelv

Objektum-orientált programozás



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ó.

Az objektum-orientált programok jellemzői

A MATLAB osztályhierarchiája

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.

A MATLAB osztályhierarchiája.

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.)

Osztályok definíciója

Egy osztály definíciója általánosságban a következőképpen fest:

classdef classname properties (attribútumok) adattagok end methods (attribútumok) metódusok end events (attribútumok) események end enumeration (attribútumok) felsorolások end end

Az osztályt a nevével megegyező, .m kiterjesztésű fájlba kell menteni.

Konstruktor, destruktor

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

p = polynom([1 0 -2 -5]);

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:

  1. Egy paramétere lehet: az osztály objektuma
  2. Nem lehet visszatérési értéke
  3. Nem lehet Sealed, Static vagy Abstract
Ammenyiben valamelyiket megszegjük, a Matlab nem ismeri el a metódust az osztály destruktorának és nem hívja meg mielőtt megsemmisítené az objektumot.

methods function delete(obj) % megj: obj mindig skalár ... end end

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.

Példánymetódusok

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:

classdef ClassName methods (AttributeName = value,...) function x = compute(obj, inc) x = obj.y + inc; end % compute method ... end % methods block ... end % classedf

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:

obj.compute(inc) compute(obj, inc)

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.

Privát metódusok, láthatóság

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:

Referencia, handle osztályok

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.

Hibakeresés a példánymetódusokban

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.

Az osztálykönyvtárak beállítása

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.

C++ és Java programozóknak

A MATLAB objektum-orientáltsága számos dologban különbözik a C++, Java nyelvekben megszokottól:

Öröklődés

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.

Egyszeres öröklődés

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:

Példányosítani a konstruktor hívásával, illetve a class paranccsal lehet:

childObj = class(childObj, 'childClass', parentObj);

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

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.

classdef ClassName < SuperClass1 & SuperClass2

A következő szintaxis használatos az objektum inicializálásakor a leszármazott osztály konstruktorában:

obj@SuperClass1(args, ...); ... obj@SuperClassN(args, ...);
ahol 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.

Operátor túlterhelés

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.

defclass MyClass properties ... end methods function output = plus(a, b) ... end end end

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.

Operátor
Függvény
Jelentés
a + b
plus(a,b)
összeadás
a - b
minus(a,b)
kivonás
-a
uminus(a)
unáris kivonás
+a
uplus(a)
unáris összeadás
a.*b
times(a,b)
tömb szorzás
a*b
mtimes(a,b)
mátrix szorzás
a./b
rdivide(a,b)
tömb osztás jobbról
a.\b
ldivide(a,b)
tömb osztás balról
a/b
mrdivide(a,b)
mátrix osztás jobbról
a\b
mldivide(a,b)
mátrix osztás balról
a.^b
power(a,b)
tömb hatványozás
a^b
mpower(a,b)
mátrix hatványozás
a < b
lt(a,b)
kisebb
a > b
gt(a,b)
nagyobb
a <= b
le(a,b)
kisebb vagy egyenlő
a >= b
ge(a,b)
nagyobb vagy egyenlő
a ~= b
ne(a,b)
nem egyenlő
a == b
eq(a,b)
egyenlő
a & b
and(a,b)
logikai és
a | b
or(a,b)
logikai vagy
~a
not(a)
logikai tagadás

Objektum precedencia

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:

Példaképp legyen a p egy általunk definiált polynom osztály objektuma, amelyhez definiálunk egy saját plus operátort is. Ekkor az 1+p kifejezésben, nem az 1 double típusú összeadás operátora hívódik meg, hanem a polynom osztályé, vagyis az 1 előbb nulladfokú polinommá konvertálódik, majd a MATLAB erre hívja meg az összeadást.