Artikel Tagged 'Object-Oriented "

Objective-C: machen Eigenschaften in einer Klasse

Ich möchte zeigen und diskutieren einige Beispiele, wie man hinzufügen und manipulieren Eigenschaften in Objective-C-Klasse. : Ein klassisches Beispiel, genau, ist die folgende, in der Definition unserer Interface-Klasse definiert zwei Eigenschaften nome und cognome :

1
2
3
4
5
6
7
8
9
10
11
/ / MyClass.h
# Import <Foundation/Foundation.h>

NSObject { @ Interface MyClass: NSObject {
nome; NSString * name;
cognome; NSString * name;
}

retain ) NSString * nome; @ Property (behalten) NSString * name;
retain ) NSString * cognome; @ Property (behalten) NSString * name;
@ End

e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: In der Implementierung-Datei die Anweisung einfügen @synthesize , so dass Xcode für uns produzieren werden die Methoden getter -und setter bzw. zum Lesen und setzen unsere zwei Eigenschaften:

1
2
3
4
5
6
7
8
/ / MyClass.m
# Import "MyClass.h"

@ Implementation MyClass

@ Synthesize Name, Vorname;

@ End

, possiamo scrive: Wenn du gehst, um unsere Klasse MyClass , dass, wenn istanziaremo ist ein Objekt vom Typ MyClass , können wir schreiben:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/ / Jede andere Klasse, als AppDelegate
/ / In der Datei. H
# Import <UIKit/UIKit.h>
# Import "MyClass.h"

@ Class TestViewController;

NSObject <UIApplicationDelegate> { @ Interface TesAppDelegate: NSObject {<UIApplicationDelegate>
UIWindow * window;
* TestViewController viewController;

MyClass * myClass;
}

/ / In der Datei. M
MyClass alloc ] ; myClass = [MyClass alloc];
"Giovambattista" ; miaClasse.nome @ = "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "miaClasse.nome =% @", miaClasse.nome);

Oder ist das äquivalent zu:

1
2
3
/ / Immer in der Datei. M
@ "Undolog" ] ; [SetNome myClass: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [myClass name]);

So weit so gut. Allerdings könnte es eine Irreführung der Gleichwertigkeit der "variable" interne (ivar) mit dem Namen des Immobilien-Objekt selber. Um zu verstehen, der Unterschied, wieder schlagen die gleiche wie Verzicht, dieses Mal, die @synthesize . . Nun, deshalb sollten wir darauf achten, dass die Methoden zu schreiben getter und setter . Zur weiteren betonen die Unterschiede, werden die internen Variablen durch Einfügen eines vor dem Namen unterstreichen umzubenennen. Aber wir sehen den Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Import <Foundation/Foundation.h>

NSObject { @ Interface MyClass: NSObject {
_nome; NSString * _Name;
_cognome; NSString * _cognome;
}

NSString * ) nome; // get - ( NSString *) name; / / get
NSString * ) cognome; // get - ( NSString *) name; / / get

void ) setNome : ( NSString * ) stringaIngresso; // set - (Void) setNome: ( NSString *) stringaIngresso; / / set
void ) setCognome : ( NSString * ) stringaIngresso; // set - (Void) setCognome: ( NSString *) stringaIngresso; / / set

@ End

. Im Gegensatz zum vorherigen Zeiger auf interne Variablen (incapsultate) geworden _nome und _cognome . . @property è scomparso, in quanto non serve più. Darüber hinaus gibt es vier Definitionen von Methoden, die unsere repräsentieren get und set . @property ist verschwunden, als nicht mehr benötigt.
Wir sehen die Umsetzung Datei MyClass.m :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Import "MyClass.h"

@ Implementation MyClass

/ / Holen Sie sich einen "Namen"
NSString * ) nome { - ( NSString *) name {
_Name Return;
}
/ / Um "name" Set
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
_Name = StringaIngresso;
}

/ / Für "Nachname" Get
NSString * ) cognome { - ( NSString *) name {
_cognome return;
}
/ / Für "Nachname" Set
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ End

Geschrieben als eine Klasse genau wie die vorherigen genutzt werden können, nämlich:

1
2
3
4
5
6
7
8
MyClass alloc ] ; myClass = [MyClass alloc];
"Giovambattista" ; miaClasse.nome @ = "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "miaClasse.nome =% @", miaClasse.nome);

/ / Oder, was gleichbedeutend ist mit:

@ "Undolog" ] ; [SetNome myClass: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [myClass name]);

e set , evidenziando – anche con l'aggiunta dell'underscore – le differenze tra il nome della proprietà e la sua ivar interna _nome . Auf der Ebene der pädagogischen Vernachlässigung @synthesize zwang uns zu schreiben "ihre" Methoden get und set , Hervorhebung - auch mit dem Zusatz dell'underscore - die Unterschiede zwischen den Namen der Eigenschaft und ihre internen ivar _nome .
permette un reale controllo del dato prima della sua impostazione (o prima della sua lettura) e quindi un reale incapsulamento per proteggere la variabile interna. Auf der funktionalen Ebene der persönlichen Nutzung der Methoden get und set ermöglicht Echtzeit-Steuerung der Daten vor ihrer Einstellung (oder vor seiner Lesung) und dann eine echte Kapselung der internen Variablen zu schützen.
Zum Beispiel wäre es möglich, den Durchgang der leeren Saiten, um eine Immobilie zu verhindern nome :

1
2
3
4
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") @ stringaIngresso = "no name";
_Name = StringaIngresso;
}

Weitere Variation

Wenn Sie die internen Variablen mit dem verwenden möchten unterstreichen vor (wer rpoviene Adobe Actionscript könnte auch verwendet werden) ist nicht notwendig, die Verwendung der Richtlinie aufzugeben @synthesize . Xcode macht es möglich, "merge" den oben genannten Verfahren:

1
2
_nome; @ Synthesize name = _Name;
_cognome; @ Synthesize name = _cognome;

. Dabei haben wir den Zeiger auf die intern verwenden könnten _nome ", resümierte" - nach außen - als eine Eigenschaft nome . e setter , è vero anche che lo fa solo se non li trova, quindi se desiderate “implementare” un vostro metodo di getter e/o setter potete farlo anche se avete usato la direttiva @synthesize . Außerdem, es ist wahr, dass die Verwendung von @synthesize automatische Generierung Methoden (Nachrichten) von produziert getter -und setter ist es auch wahr, dass, wenn er sie nicht findet, so, wenn Sie "implementieren" eine Methode für Ihren gewünschten getter -und / oder setter können Sie dies tun, auch wenn Sie der Richtlinie verwendete @synthesize .

Speicherzuordnungen

In den obigen Beispielen habe ich einige wichtige Details für eine reale Umsetzung verzichtet. Zunächst einmal habe ich keine Methode gezeigt init() , nützlich für die Initialisierung des Objektes und Standardwerte. Darüber hinaus gibt es die Zugabe einer Methode dealloc() :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/ / File MyClass.m
# Import "MyClass.h"

@ Implementation MyClass

id ) init { - (Id) init {
self = [ super init ] ) { if (self = [super init]) {
"Nome preimpostato" ; _Name @ = "Preset Name";
"Cognome preimpostato" ; _cognome @ = "Preset Name";
}
Rückkehr Selbst;
}

void ) dealloc { - (Void) {dealloc
; [_Name Release];
; [_cognome Release];
; [Super dealloc];
}

NSString * ) nome { - ( NSString *) name {
_Name Return;
}
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") @ stringaIngresso = "no name";
_Name = StringaIngresso;
}

NSString * ) cognome { - ( NSString *) name {
_cognome return;
}
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ End

, etc… In Zukunft werden wir dann sehen, die Details über die Eigenschaften readonly , retain , etc ... :)

Fortsetzung ...

Von Actionscript zu Objective-C

Ich dachte, es könnte nützlich sein für diejenigen, die vor kurzem die Entwicklung von Anwendungen für Apple iPhone genähert haben, vergleichen Sie Adobe ActionScript - die Sprache, in Adobe Flash und Adobe Flex verwendet, häufiger unter den neo-Programmierer - und Objective-C verwendet von Apple, um ihre Anwendungen zu entwickeln. Objective-C ist in der Tat eine objektorientierte Sprache, die im reinen Sinne, nicht, dass es nicht actionscript, aber Objective-C ist definitiv ein Plus, weil es eine Erweiterung von ANSI C und die Syntax ist eine Mischung zwischen C / C + + und Smalltalk, ist eine echte OO (Object-Oriented Language).

Fortsetzung ...

Überlastung

Überladen ist ein sehr nützliches Feature von einigen Programmiersprachen zu Objekten. Allerdings tuti OO-Sprachen unterstützen es nicht, und einige der "Umsetzung" oder oder verschieden begrenzt. In der Regel Funktionen oder Methoden, ermöglicht eine Überlastung Sie zwei oder mehr Funktionen / Methoden, die den gleichen Namen haben, aber akzeptieren verschiedene Parameter, zum Beispiel zu erstellen:

Fortsetzung ...

Entwicklung Sprachen

I "wiederbelebt" werden in diesem Artikel von mir schrieb ein wenig "von Jahren. Ich geringfügig überarbeitet und aktualisiert ein bisschen hier und da, aber ich denke, es ist immer noch relevant und interessant.

EINFÜHRUNG

Was ist eine Programmiersprache? Ein Computer, auch bekannt als PC (Personal Computer), hat eine persönliche Sprache. Diese Sprache ist Maschinencode genannt, zu verstehen, dass jede Maschine, so dass alle Computer (PC kompatibel, Apple, Unix, etc. ...), hat eine einzigartige und proprietäre. Die Programme, die wir sehen "run" auf unsere PCs sind vor allem durch die mysteriösen Objekt mit dem Namen eines Mikroprozessors durchgeführt. Dies ist das Herz, das intelligente Modul, jeden Computer. In der Tat ist nur eine Anwendung nicht ausgeführt, sondern wird durch den Mikroprozessor unterstützt, so zu sprechen, was man ein Betriebssystem: eine Software-Schicht, die durch den Hersteller der Maschine geliefert (siehe zum Beispiel den Apple Macintosh).

Fortsetzung ...

Klassen, Objekte und Instanzen

Ich bemerkte, oft Verwirrung, wenn es um Klassen, Objekte und Instanzen geht. Diejenigen, die nicht sehr gebildet auf der objektorientierten Programmierung verwechselt oft die wahre Bedeutung dieser Begriffe. Ich wusste jedoch, dass es zwei Denkschulen in Bezug auf die Definition von Klassen und Objekten. Ich mag die "Schule", dass die Klassen-Definition gibt als möglichen Gegenstand, und daher, wie eine Instanz des Objekts.

Es scheint trivial, aber ich habe - im Gespräch mit anderen - in "Konflikt" (sozusagen) und fallen dann in Verwirrung, wenn Sie diese Bedingungen, ausgehend von der Annahme, dass, wenn etwas "anderen" so wie wir sie wollen .

Ich sehe es auf diese Weise wird eine Klasse eine Definition! Es ist genau definiert eine Klasse möglicher Objekte. Die Klasse ist der Satz von Methoden und Eigenschaften (wenn Sie möchten, wir können auch Ereignisse - was sonst ... nicht nur, dass spezielle Methoden), die das Objekt besitzen soll.

Zum Beispiel, wenn wir in Actionscript zu schreiben, oder jede andere objektorientierte Sprache:

1
2
3
4
class MyClass {
MiaClass function () {}
Funktion myMethod () {}
}

Wir haben eine Klasse und nicht ein Objekt definiert. Im Grenzfall haben wir "definiert" eine "mögliche" Objekt. Wir könnten sogar sagen, und das zu Recht, dass das Objekt zur Laufzeit existiert, während die Klasse nicht (in Wahrheit gibt es dynamische Klassen, die definiert werden können - und dann verwendet, um Objekte zu erstellen - auch während der Laufzeit). Ausschließen statische Klassen, natürlich, dass - letztendlich - sind nichts anderes als sub-Instanzen (oder Instanzen versteckt) und dann reale Objekte.

Aber wenn wir:

1
MiaClasse = new MiaClasse ( ) ; var MyObject: MyClass = new MyClass ();

! Hier mioOggetto ist eine Instanz von MiaClasse() ! . Das mioOggetto ist ein Thema - in der Tat - vom Typ MiaClasse() .

. Als Ergebnis ihrer Philosophie, Objekte, Objekte vom Typ MiaClasse() Ich kann so viele, wie ich will, was nicht sein kann - die Definition - von MiaClasse() . Zum Beispiel, wenn der Bericht wahr ist und es macht Sinn:

1
2
3
4
5
MiaClasse = new MiaClasse ( ) ; var mioOggetto_1: MyClass = new MyClass ();
MiaClasse = new MiaClasse ( ) ; var mioOggetto_2: MyClass = new MyClass ();
MiaClasse = new MiaClasse ( ) ; var mioOggetto_3: MyClass = new MyClass ();
...
MiaClasse = new MiaClasse ( ) ; var mioOggetto_n: MyClass = new MyClass ();

Es macht keinen Sinn:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MyClass {
MiaClass function () {}
MioMetodo_2 function () {}
}

class MyClass {
MiaClass function () {}
MioMetodo_2 function () {}
}

class MyClass {
MiaClass function () {}
MioMetodo_3 function () {}
}

Object Instance, und daher zusammen und sind abwechselnd für die gleiche Bedeutung in verschiedenen Zusammenhängen verwendet.

Wahrscheinlich nicht viel jemand kümmert sich ... die Frage nach der Vollständigkeit der Anforderungen ... :)

Fortsetzung ...

Schreiben Sie gute OO-Code in Adobe Flash

Hier sind einige Tipps, wie Sie guten Code Objektorientierte (OO) in Adobe Flash zu schreiben, vor allem für diejenigen, die noch mit der Version MX darauf warten, bis CS3 gehen.

Organisieren Klassen Ordner

Zunächst macht die Organisation von Klassen die Arbeit wesentlich einfacher Code Wartung. Sie können auch eine echte Bibliothek, die Sie in anderen Projekten wiederverwenden können. Flash verwendet eine Klassifizierung in Bezug auf das Dateisystem und dann die Organisation in Ordnern wird auch auf den Import von Klassen widerspiegeln. Zum Beispiel, wenn wir erstellen die Reihenfolge der Ordner "mylibrary / graphics / plot" und legen unseren eigenen ActionScript-Klasse "PlotClass.as", wenn wir verwenden sollten, um die Klasse zu importieren:

1
grafica . plot . PlotClass ; . mylibrary Importe Grafiken Grundstück PlotClass..;

Wenn die Bibliothek (Ordner) "MyLibrary" ist nicht in Ihrem Film Ordner oder Projekt, mit dem Flash veröffentlichen Einstellungen, um den Pfad auswählen:

Einstellen percoroso Bibliotheken

Fortsetzung ...