„Objective-C programozási nyelv” változatai közötti eltérés

[nem ellenőrzött változat][nem ellenőrzött változat]
Tartalom törölve Tartalom hozzáadva
Daviis (vitalap | szerkesztései)
Daviis (vitalap | szerkesztései)
42. sor:
 
=== Interfészek és implementációk ===
Az Objective-C nyelvben egy osztály interfésze és implementációja különálló kód-tömbökben kell legyen. Megegyezés szerint az interfészt egy header fáljban (általában .h kiterjesztéssel) míg az implementációt egy kód fáljban helyezzük el (általában .m kiterjesztéssel).
 
==== Interfészek ====
Az interfész általában a header fáljban van leírva. Szokványos hogy a fálj neve az osztály neve is egyúttal. Ha van egy Foo osztályunk, akkor ezt általában a Foo.h fáljba tesszük.
 
 
Példa egy interfész leírásra:
 
<source lang="objc">
@interface osztálynév : ősosztálynév {
// változók
}
 
+osztályMetódus1;
+(típus)osztályMetódus2;
+(típus)osztályMetódus3:(típus)paraméter_neve;
-(típus)példányMetódus1:(param1_type)paraméter1_neve :(típus)paraméter2_neve;
-(típus)példányMetódus2Paraméter1:(típus)paraméter1_neve ésParaméter2:(típus)paraméter2_neve;
@end
</source>
 
A '+' azt jelenti, hogy osztálymetódus, a '-' hogy példány metódusa. Az osztálymetódusok nem férhetnek hozzá a változókhoz.
 
Ugyanez a kód C++ nyelven:
<source lang="cpp">
class osztálynév : ősosztálynév { {
// változók
// Osztály (statikus) metódusok
static void* osztályMetódus1();
static típus osztályMetódus2();
static típus osztályMetódus3(típus paraméter_neve);
// Példány metódusok
return_type példányMetódus1(típus paraméter1_neve,típus paraméter2_neve);
return_type példányMetódus1Paraméterek(típus paraméter1_neve, típus paraméter2_neve);
};
</source>
 
Megfigyelhetjük, hogy a <tt>példányMetódus2Paraméter1</tt> példázza az Objective-C egyik különlegességét, hogy a paramétereket nevesíteni lehet a függvény nevében -- ennek nincs C++ megfelelője.
 
A visszatérési típusok lehetnek bármilyen standard C típusok, egy pointer egy Objective-C objektumra, vagy egy specifikus objektumra mutató pointer (NSArray *, NSImage *, NSString *). Az alapértelmezett típus <tt>id</tt>, ami bármilyen Objective-C objektumot jelöl.
 
A metódusok paraméterei kettősponttal kezdődnek, utána következik a típus majd a neve. Sok esetben érdemes megnevezni a paramétereket:
<source lang="objc">
-(void) setRange:(int)start :(int)end;
-(void) importDocumentWithName:(NSString *)name withSpecifiedPreferences:(Preferences *)prefs beforePage:(int)insertPage
</source>
 
==== Implementációk ====
 
Az interfész csak a metódusok és változók neveit deklarálja; maga a kód az implementációban létezik. Általában .m kiterjesztésű fájlokba tesszük.
 
 
<source lang="objc">
@implementation classname
+osztályMetódus {
// implementáció
}
-példányMetódus {
// implementáció
}
@end
</source>
 
Összehasonlítva a C++ és Objective-C közti különbségeket:
 
<source lang="objc">
-(int)foo:(int)bar {
return [self square_root: bar];
}
</source>
 
<source lang="c">
int foo(int bar) {
return square_root(bar);
}
</source>
 
 
Itt egy példa a paraméterek nevesítésére és használatára:
 
<source lang="objc">-(int)changeColorToRed:(float)red green:(float)green blue:(float)blue
 
[myColor changeColorToRed:5.0 green:2.0 blue:6.0];
</source>
 
 
==== Példányosítás ====
Az Objective-C osztályokat két lépésben példányosítjuk: elöször lefoglaljuk a memóriát az új objektum számára majd inicializáljuk. Egy objektum addig nem működőképes, amíg mindkét lépést nem végeztük el. Ezeket általában egyetlen sorban meg lehet oldani:
 
<source lang="objc">MyObject * o = [[MyObject alloc] init];</source>
 
Az <tt>alloc</tt> hívás elegendő memóriát foglal le, az <tt>init</tt> hívás felülírható, hogy a változókat inicializálhassuk:
 
<source lang="objc">
-(id) init {
self = [super init];
if (self) {
ivar1 = value1;
ivar2 = value2;
.
.
.
}
return self;
}
</source>
 
=== Protokollok ===