Cap. 9. Introducere in Objective-C

Objective-C este tot o extensie a limbajului C pentru lucrul orientat pe obiecte, considerata uneori superioara C++. Sistemul de operare NextStep a fost scris in intregime in Objective-C.
Spre deosebire de C++, pentru compilarea codului scris in Objective-C nu este necesar un compilator special. Objective-C consta intr-un preprocesor care transleaza codul Objective-C in cod C, urmand ca acesta sa fie transformat in cod obiect de catre un compilator standard C.
Toate clasele sunt derivate in mod automat din clasa predefinita Object. Aceasta clasa poate fi referita prin intermediul identificatorului super.
Fata de C++ sunt cateva deosebiri: nu se poate realiza mostenire multipla, nu exista nici un mecanism de control al accesului, etc.
Metodele de acces la datele incapsulate in interiorul clasei pot fi apelate trimitand mesaje catre obiecte. Gestionarea mesajelor este transparenta pentru programator, implementarea fiind realizata cu ajutorul unor functii de biblioteca. Sintaza apelarii metodelor este urmatoarea:

[Obiect Metoda]


sau cu parametri:

[Obiect Metoda:Parametri ...]


Analog se pot referi datele apartinand clasei:

[Obiect DataMembra]


Declararea obiectelor se face astfel:

id variabila


cu remarca ca declararea unui identificator nu duce la crearea obiectului. Pentru a crea obiecte in Objective-C este nevoie de o fabrica de obiecte (factory object). Obiectul fabrica, unul pentru fiecare clasa, poarta acelasi nume ca si clasa, si este generat automat de catre preprocesorul Objective-C. Sarcina programatorului este de a declara metodele de constructie a obiectelor. Aceste metode sunt aplicate numai obiectului fabrica.
Sintaxa declararii claselor este urmatoarea:

@interface NumeClasa : Object {
...
/* declaratii date membre */
}

+ metode_de_fabricare

- metode_normale

@end


Metodele de fabricare se declara astfel:

+ NumeParametruExterior: (TipData)NumeParametruInterior ...


sau fara parametri:

+ NumeMetoda


Metodele normale se declara ca mai jos:

- NumeParametruExterior: (TipData)NumeParametruInterior ...


sau fara parametri:

- NumeMetoda


Exista o metoda de fabricare implicita, numita new, si care apartine clasei comune, Object, si care poate fi evident supradefinita.
Sintaxa generala a definirii unei clase este:

@implementation NumeClasa : Object {
...
/* date specifice fiecarei instante */
}

+ metode_de_fabricare
{
/* cod */
};

{
- metode_normale
{
/* cod */
};

@end


In interiorul metodelor normale poate fi utilizat identificatorul self, care desemneaza obiectul apelat. Functionalitatea acestuia este similara celei a identificatorului this din C++.
In ceea ce priveste parametrii metodelor, trebuie mentionat ca daca nu se declara nici un tip, acesta este considerat de tipul clasei in cauza. De asemenea, valoarea returnata este implicit de tipul clasei. Daca metoda nu intoarce nici o valoare, conventia este ca ea sa intoarca identificatorul obiectului care a primit mesajul, self.
In continuare vom rescrie clasa Point realizata in cap. 3.

#include <objc/Object.h>

@interface Point : Object
{
unsigned x, y;
}

+ X: (unsigned)__x Y: (unsigned)__y;
+ new;
- SetX: (unsigned)__x;
- SetY: (unsigned)__y;
- (unsigned)GetX;
- (unsigned)GetY;
- (unsigned long)Arie;

@end

@implementation Point : Object
{
unsigned x, y;
}

+ X: (unsigned)__x Y: (unsigned)__y
{
self = [super new];
[self SetX:__x];
[self SetY:__y];
return self;
}

+ new {
self = [super new];
[self SetX:0];
[self SetY:0];
}

- SetX: (unsigned)__x
{
x = __x;
return self;
}

- SetY: (unsigned)__y
{
y = __y;
return self;
}

- (unsigned)GetX
{
return x;
}

- (unsigned)GetY
{
return y;
}

- (unsigned long)Arie
{
return x * y;
}

@end

main()
{
id p;

p = [Point X:5 Y:10];
printf("Aria = %d\n", [p Arie]);
}




Realizat de Dragos Acostachioaie, ©1998
http://www.biosfarm.ro/~dragos