Az eredeti Cobol nem tartalmaz objektum-orientált eszközöket. Ez nem is csoda, hiszen a nyelv sokkal korábbi, mint az objektumelvűség definíciója. Ugyanakkor a modernizálás szelleme a Cobolt sem kerülte el, így megalkotásra került az OO Cobol. Erről egy rövid összefoglaló található itt. Egy bővebb linkgyűjtemény pedig itt.
Az OO COBOL lehetőséget ad osztályok, objektumok definiálására, adat enkapszuláció, metódusok megadására. Lehetőség van öröklődésre és alosztályok létrehozására, megvalósítható a polimorfizmus. Az objektumok valamely osztályhoz tartoznak, az osztály megadja az adattagokat és a metódusokat. Az object osztály egy olyan objektum, mely létrehozza a többi objektumot. Az interfész független az osztály objektumaitól. Az interfészek között akkor áll fenn egyezőség, amennyiben egy olyan objektum, amely tartalmazza az első interfész minden metódusát bárhol használható ahol használható egy olyan objektum, amely tartalmazza a második interfész minden metódusát.
Az osztály definíciója:
A metódus rendelkezik mewtódus-névvel és rendelkezik saját
adatszegmenssel (Data Division), és eljárás-szegmens (Procedure
Division). A metódus meghívása az objektumra mutató referencia és a
metódusnévvel lehetséges. Definiálhatunk paraméterlistát és
visszatérési értéket. A metódusban definiált adatok lokálisak az adott
metódusban.
A metódus definíciója:
Egy adott objektum M nevű metódusának meghívása:
ahol PAR a paraméterlista, vagy ugyanez beszédesebb utasítással:
Az OO COBOL klasszikus objektum-modellt valósít meg.
Az OO COBOL kommunikációs modellje: szinkronikus.
Az objektum életciklusa a létrehozásával kezdődik és a megszüntetésével ér véget. Egy osztály adott objektumának létrehozása az object osztály CBL-CREATE metódusa segítségével történik. Egy objektum lehet:
Az OO COBOL-ban egy adat tartalmazhat különböző objektumokat különböző osztályokból; ez azt jelenti, hogy ezen az adaton megvalósított metódushívás összekapcsolható több lehetséges metódus közül eggyel. Bizonyos esetekben ez a metódus már futási idő előtt meghatározható, de általában a metódus nem határozható meg futtatás előtt.
Egy adat tartalmazhatja egy adott osztály objektumait, azonban deklarálhatjuk úgy is, hogy egy adott interfésszel egyező objektumokat tartalmazzon. Amennyiben az interfészt adjuk meg, az egyező objektumok osztályai teljesen különbözőek is lehetnek.
Megadása:
Az objektum definiálásakor a metódusok lehetnek
Az OO COBOL megkülönbözteti az objektum referencia és az objektum azonosító fogalmakat. Az OO COBOL-ban az objektum referencia egy érték, amely egyedileg azonosítja az objektumot az élettartama alatt. Két objektumnak nem lehet ugyanaz a referenciája és minden objektumnak van legalább egy referenciája. Megengedett, hogy egy objektumnak több referenciája is legyen, de erősen ajánlott és általánosságban igaz, hogy egy objektumnak egy referenciája van.
Az OO COBOL-ban az objektum azonosító (egy adat) azonosítja az objektumot. A "Data Division" részben deklarálható: USAGE IS OBJECT REFERENCE. Van három előre definiált objektum azonosító:
Az objektum azonosítók egyenlőségét vizsgálhatjuk. Két objektum azonosító azonos, ha az általuk mutatott objektum ugyanaz.
Az INHERITS kulcsszóval adhatók meg azon osztályok, amelyekből az osztály származik. Az OO COBOL-ban definiált egy CBL-BASE osztály, amelyből a COBOL osztályok származnak. Nem kötelező az osztályoknak ebből a CBL-BASE osztályból származniuk. Az osztályöröklődés itt implementációs fogalom. Az interfészeket definiálhatom úgy, hogy átörökítsék az osztály interfészeit és/vagy másik interfészeket. Mindét öröklődésnél (osztály és interfész öröklődés) lehetséges többszintű öröklődés. Biztosítani kell, hogy az öröklődés megőrizze az interfész egyezőséget. Az interfész- és osztálydefiníciók összessége valójában egy altípus-hierarchiát ír le az objektumok, osztályok és interfészek közötti egyezőségi reláció segítségével. Minden öröklődés public típusú.
Az adattagokra a következők érvényesek:
Minden metódus az osztály PROCEDURE DIVISION részében definiált. Rendelkezik saját WORKING-STORAGE résszel, paraméterek esetén pedig LINKAGE résszel. A metódusok virtuális és public típusúak. Ezeket a metódusokat az INVOKE utasítással hívhatjuk meg. Például:
A COBOL-ban nincs lehetőség definíció nélküli függvények deklarálására. Ebből fakadóan, nem lehet absztrakt ősosztályt létrehozni. Az operátortúlterhelés sem támogatott.
Az objektumokat a SOMClass osztály metódusainak segítségével lehet
létrehozni és törölni. Egy objektumot a somNew metódus segítségével
lehet létrehozni. Ez a metódus az objektumhoz tartozó referenciát adja
vissza. Lehetőség van az objektumok törlésére is.
Ezt a somFree metódus segítségével lehet megtenni. (több nyelvben
ezeket a new és a delete operátorokkal érhetjük el. Pl: c++)
Mivel tömbök allokálása nem lehetséges, ezért a new[] és delete[]
operátorokhoz hasonló metódusok nincsenek.
Minden osztály a SOMObject ősosztályból származik. Ez az ősosztály
tartalmazza a somInit (konstruktor) és a somUninit (destruktor)
metódusokat.
Az objektumok létrehozásánál a somNew metódus meghívja a somInit-et, a
somFree pedig a somUninit-et.
Ahogyan a nyelvek többségében is, a COBOL-ban sincs az alap
konsturktornak paramétere.
A somNew konstrukor működését felül lehet definiálni, de csak paraméter
nélküli somNew-val. (tehát nincs lehetőség paraméteres konstruktor
írására)
Az OO Cobol program fordítása sokkal bonyolultabb mint egy sima "compile-link-run" folyamat. A főbb lépések a következők: