A Sather programozási nyelv

Objektum orientált eszközök



Öröklődés és kódmegosztás

A Sather nyelvben lehetőség van az öröklődés és a kódmegosztás fogalmának szétválasztására, vagyis a legtöbb nyelvben megjelenő öröklődés fogalmát kettéválasztják tényleges öröklődésre (vagyis altípusképzésre) és kódmegosztásra.

Satherben külön módszer van mindkét fogalomhoz. Az absztrakt osztályok felületeket (interface) definiálnak: egy szignatúra halmaz, mely az ADT megvalósítandó műveleteit adja meg. Osztályok (class) átvehetik más osztályok kódjait (include), de ez nem jelent alárendeltséget, altípus jellegű kapcsolatot. Így egyszerűbb és könnyebben érthető lesz a program, mivel altípust csak absztrakt osztályból származtathatunk.

A nyelvben van egy ún. típus gráf (irányított, körmentes), amelyben az absztrakt osztályokból építenek fel egy hierarchiát (subtyping és supertyping segítségével, még nincs kódmegosztás). Ez tulajdonképpen egy keresztéleket is tartalmazó gyökeres fa, amelynek gyökere a $OB típus. Itt még semmit sem mondunk a megvalósításról. Amikor ebből a hierarchiából meg akarunk valamit valósítani, akkor felhasználhatunk más konkrét osztályoktól kódokat.

A kódmegosztás a Satherben tehát ténylegesen csak újrafelhasználást jelent, semmi többet. Ezt tükrözi a felhasznált kulcsszó, az ‘include’ is. Ezzel adott osztályok implementációját egyesíthetjük. Ezáltal átnevezhetünk és törölhetünk is bizonyos jellemzőket. Itt is alkalmazható a ‘private’ megszorítás, miszerint a felhasználandó kód alapértelmezés szerint itt private lesz (hacsak mást nem adunk meg az egyes jellemzőknél). Például:

include A a-<b, c-<, d-<private d; -- az A osztályból átveszi: --   az a-t, és átnevezi b-re --   a c-t (azonos névvel) --   a d-t (azonos névvel, de private-ként) private include D e-<readonly f; --   és a D-től átveszi az e-t, amit readonly-vá tesz és f-re nevez át

Megjegyzések:

Túlterhelés

Sather sok más nyelvhez hasonlóan támogatja eljárások túlterhelését. Két eljárás különbözőnek minősül, ha legalább egy pontban eltér szignatúrájuk. A szignatúra elemei: az eljárás neve, argumentumok száma és típusa, visszatérési érték léte (a típusa viszont nem!).

Kétféle overload-ot használhatunk: az interface egy jellemzőjét írhatjuk újra, és egy paraméteres osztály paraméteres eljárásának példányosítása. De osztály paraméter nem old fel eljárás argumentumütközést, tehát a következő kódrészlet nem megengedett: (egyébként érthető módon, ugyanis általános esetben nem eldönthető, hogy példányosításkor T1 és T2 lehetnek-e azonosak).

class FOO{T1>$STR ,T2>$ELT} is   bar(a:T1);   bar(a:T2); end;

Operátorok

Satherben minden operátornak van egyszerű függvény megfelelője, és a kettő fizikailag is megegyezik (pl. a ‘+’ jel egy átnevezése a plus( ) függvénynek). Ezáltal ha a plus( ) eljárást átdefiniáljuk, akkor ezzel együtt ‘+’ operátor jelentése is megváltozik. Némely operátor jelentése más operátorét is befolyásolja. Ilyenek a ‘>’ és ‘<’ valamint a ‘>=’ és ‘<=’ operátorok. Ezek jelentése következetesen a matematikai értelemben vett részleges és teljes rendezés kell legyen, nem akármilyen rövidítés a céljuk (csak ’>’ operátor van, a többi összehasonlítást ennek segítségével fejezi ki).

Részosztályok és eljárás tönkök

Satherben lehetőség van részosztályok (partial class) definiálására is, melyek szerepe kizárólag kód-ős funkció ellátása. Ilyen osztályok kódjait felhasználhatjuk más osztályok implementálása során, de magát az osztály nem példányosíthatjuk, nem hívhatjuk meg eljárásait és változónak sem lehet típusa.

Eljárás tönkök csak rész-osztályokban fordulhatnak elő. Ezeknek nincs törzsük, csak szignatúradefiniálásra használható, amit majd befoglaló osztályok felüldefiniálnak. Ha egy részosztályban nem implementált eljárást hívunk meg, annak tönkjét definiálni kell.

Megjegyzés: részosztályokkal nem példányosíthatunk paraméteres osztályokat.