Az Objective-C programozási nyelv

Generikus programozás

Generikus programozás

Az Objective-C-ben nincs külön nyelvi eszköz a generikus programozás támogatására, de nincs is rá szükség mível típusokkal, osztály objektumok segítségével hagyományos módon tudunk paraméterezni.

Testreszabás osztályobjektumokkal

Nem pusztán szeszély, hogy az Objective-C nyelvben az osztályokat objektumokként kezeljük. Ez egy döntést melynek szándékos, és néha meglepő, tervezési előnyei vannak. Például egy objektum testre szabható egy osztállyal, ahol az osztály egy nyílt végű halmazhoz tartozik. Az AppKit-ben például, egy NSMatrix objektumot testre szabhatjuk bizonyos típusú NSCell objektumokkal.

Egy NSMatrix objektum vállalhatja azt a feladatot, hogy létrehozza azokat az objektumokat amelyek a celláit reprezentálják. Ezt megteheti amikor a mátrix először inicializálódik vagy később amikor a cellákra szükség van. A mátrix amit az NSMatrix objektum rajzol a képernyőre nőhet és zsugorodhat is futásidőben, például felhasználói akciókra reagálva.

Amikor növekszik, a mátrix létre kell tudjon hozni új objektumokat, hogy megtöltse az újonnan hozzáadott helyeket. De milyen objektumok legyenek? Minden mátrix csak egy típusú NSCell-t jelenít meg, de ebből többféle típusú van, amelyek mindegyike az NSCell-ből származik.

Amikor a mátrix NSCell objektumokat hoz létre, azok NSButtonCell objektumok legyenek, hogy gombokat vagy kapcsolókat jelenítsük meg, vagy NSTextFieldCell objektumok, hogy mezőket jelenítsünk meg ahhova a felhasználó beírhat vagy módosíthat szövegeket, vagy valami más típusú NSCell? Az NSMatrix objektumnak bármilyen típusú mezővel működnie kell, még olyan típusokkal is melyek még nem léteznek.

Erre a problémára az egyik megoldás az lehet, ha absztraktnak definiáljuk az NSMatrix osztályt és minden felhasználójától elvárjuk, hogy definiáljon egy alosztályt melyben implementálja az új mezők létrehozását végző metódusokat. Mivel a felhasználók maguk implementálják a metódusokat, biztosak lehetnek benne, hogy az általuk létrehozott objektumok megfelelő típusúak.

De ez a megoldás elvárná az NSMatrix osztály felhasználóitól, hogy elvégezzék azt a munkát amit magának az NSMatrix osztálynak kellene, és szükségtelenül megnöveli az osztályok számát. Mivel egy alkalmazásban többféle mátrixra is szükségünk lehet, különböző típusú mezőkkel, előfordulhat, hogy NSMatrix alosztályoktól válik túlzsúfolttá.

Továbbá, a különböző projekteken dolgozó programozók ugyanazokat a lényegében megegyező kódokat írnák ugyanarra a célra, csak azért, hogy ellensúlyozzák az NSMatrix osztály sikertelenségét a probléma megoldásában. Egy jobb megoldás, amit az NSMatrix osztály is alkalmaz, annak megengedése, hogy az NSMatrix példányokat egy NSCell típussal, azaz osztály objektummal, inicializálják. Az NSMatrix osztály szintén definiál egy setCellClass metódust, ami átadja az NSCell objektum típushoz tartozó osztály objetkumot, ami alapján egy NSMatrix fel kell töltse az üres helyeket:

[myMatrix setCellClass:[NSButtonCell class]];

Az NSMatrix objektum az osztály objektumot használja az új mezők létrehozására amikor először inicializálják és bármikor ha újraméretezik azért, hogy több mezőt tartalmazzon. Ez a fajta testreszabás bonyolult lenne, ha az osztályok nem lennének objektumok, amiket üzenetekben átadhatunk és változókhoz rendelhetünk.