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