Articles taggés avec 'Object-Oriented »

Objective-C: les propriétés d'exposer dans une classe

Je voudrais montrer et de discuter quelques exemples sur la façon d'ajouter et de manipuler les propriétés en Objective-C de classe. : Un exemple classique, précisément, est la suivante, dans la définition de notre classe d'interface définit deux propriétés nome et cognome :

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

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

retain ) NSString * nome; @ Property (conserver) NSString * name;
retain ) NSString * cognome; @ Property (conserver) NSString * name;
@ Fin

e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: Dans le fichier de mise en œuvre de l'instruction INSERT @synthesize afin que Xcode va produire pour nous les méthodes getter et setter , respectivement, utilisé pour lire et définir nos deux propriétés:

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

@ Mise en oeuvre MaClasse

Synthétiser le nom @, prénom;

@ Fin

, possiamo scrive: Lorsque vous allez utiliser notre classe MyClass , qui est quand istanziaremo un objet de type MyClass , nous pouvons écrire:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/ / Tout autre classe, comme AppDelegate
/ / Dans le fichier. H
# Import <UIKit/UIKit.h>
# Import "MyClass.h"

@ Classe TestViewController;

NSObject <UIApplicationDelegate> { TesAppDelegate @ interface: NSObject {<UIApplicationDelegate>
UIWindow * fenêtre;
* TestViewController ViewController;

MaClasse * maClasse;
}

/ / Dans le fichier. M
MyClass alloc ] ; maClasse = [MaClasse alloc];
"Giovambattista" ; miaClasse.nome @ = "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "miaClasse.nome =% @", miaClasse.nome);

Ou, ce qui équivaut à:

1
2
3
/ / Toujours dans le fichier de M.
@ "Undolog" ] ; [SetNome maClasse: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [nom maClasse]);

Jusqu'ici tout va bien. Cependant, il pourrait induire en erreur l'équivalence de la «variable» interne (Ivar) avec le nom de la propriété elle-même. Pour comprendre la différence, de proposer à nouveau la même chose que faire sans, cette fois, les @synthesize . . Maintenant, donc, nous devrions prendre soin d'écrire les méthodes getter et setter . Afin de mieux souligner les différences, va renommer les variables internes en insérant un caractère de soulignement devant le nom. Mais nous voyons le code:

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

NSObject { @ Interface MaClasse: NSObject {
_nome; NSString * _Nom;
_cognome; NSString * _cognome;
}

NSString * ) nome; // get - ( NSString *) nom; / / récupère
NSString * ) cognome; // get - ( NSString *) nom; / / récupère

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

@ Fin

. Contrairement à la précédente pour les pointeurs de variables internes (incapsultate) sont devenus _nome et _cognome . . @property è scomparso, in quanto non serve più. En outre, il existe quatre définitions des méthodes qui représentent notre get et de set . @property a disparu, comme n'étant plus nécessaires.
Nous voyons le fichier d'implémentation 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"

@ Mise en oeuvre MaClasse

/ / Obtenir un "nom"
NSString * ) nome { - ( NSString *) nom {
_Nom Retour;
}
/ / Set pour "nom"
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
_Nom StringaIngresso =;
}

/ / Obtenir de "surnom"
NSString * ) cognome { - ( NSString *) nom {
_cognome retour;
}
/ / Set pour "patronyme"
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ Fin

Écrit comme une classe peut être utilisé exactement comme la précédente, à savoir:

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

/ / Ou, ce qui équivaut à:

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

e set , evidenziando – anche con l'aggiunta dell'underscore – le differenze tra il nome della proprietà e la sua ivar interna _nome . Au niveau de la négligence éducative @synthesize nous a forcé à écrire "leur propre" méthodes get et de set , en soulignant - même avec l'ajout dell'underscore - les différences entre le nom de propriété et ses Ivar internes _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. Au niveau fonctionnel à l'usage personnel des méthodes get et de set permet un contrôle réel des données avant sa mise (ou avant sa lecture), puis une encapsulation réel de protéger la variable interne.
Par exemple, il serait possible d'empêcher le passage des chaînes de vide à la propriété nome :

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

D'autres variations

Si vous souhaitez utiliser les variables internes avec le trait de soulignement en face (qui rpoviene Adobe ActionScript pourrait être utilisé aussi bien) n'est pas nécessaire d'abandonner l'utilisation de la directive @synthesize . Xcode permet de "fusionner" les méthodes mentionnées ci-dessus:

1
2
_nome; Synthétiser @ name = _Nom;
_cognome; Synthétiser le nom @ = _cognome;

. En faisant cela, nous pourrions utiliser le pointeur à l'interne _nome ", résume" - à l'extérieur - comme une propriété 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 . Par ailleurs, il est vrai que l'utilisation de @synthesize produit des méthodes de génération automatique (messages) de getter et setter , il est également vrai que s'il ne les trouve pas, donc si vous voulez "mettre en œuvre« une méthode pour vos getter et / ou setter vous pouvez le faire même si vous avez utilisé la directive @synthesize .

Les allocations de mémoire

Dans les exemples ci-dessus, j'ai omis certains détails importants pour une mise en œuvre réelle. Tout d'abord, je n'ai pas montré toute méthode init() , utile pour l'initialisation objet et les valeurs par défaut. Par ailleurs, il est l'ajout d'une méthode 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
/ / Fichier MyClass.m
# Import "MyClass.h"

@ Mise en oeuvre MaClasse

id ) init { - (Id) {initialisation
self = [ super init ] ) { if (self = [super init]) {
"Nome preimpostato" ; _Nom @ = "Nom Preset";
"Cognome preimpostato" ; _cognome @ = "Nom Preset";
}
le retour de soi;
}

void ) dealloc { - (Void) dealloc {
; [Communiqué de _Nom];
; [Communiqué de _cognome];
; [Super dealloc];
}

NSString * ) nome { - ( NSString *) nom {
_Nom Retour;
}
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") @ stringaIngresso = "sans nom";
_Nom StringaIngresso =;
}

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

@ Fin

, etc… Dans l'avenir, nous verrons ensuite les détails sur les propriétés readonly , retain , etc ... :)

Suite ...

À partir d'ActionScript à Objective-C

J'ai pensé qu'il pourrait être utile à ceux qui ont récemment approché le développement d'applications pour l'iPhone d'Apple, comparez Adobe ActionScript - le langage utilisé dans Adobe Flash et Adobe Flex, plus fréquente chez les néo-programmeurs - et Objective-C de langue utilisé par Apple pour développer ses applications. Objective-C est en effet un langage orienté objet, dans le sens pur, non pas qu'il n'est pas actionscript, mais Objective-C est certainement un plus, car il est une extension du C ANSI et sa syntaxe est un mélange entre le C / C + + et Smalltalk, est une vraie OO (Object-Oriented Language).

Suite ...

Surcharge

La surcharge est une fonctionnalité très utile de certains langages de programmation à des objets. Cependant tuti langages OO ne le supporte pas, et certains des «exécution» ou limitées ou différentes. En général, les fonctions ou les méthodes, la surcharge vous permet de créer deux ou plusieurs fonctions / méthodes qui ont le même nom mais accepter des paramètres différents, par exemple:

Suite ...

Langages de développement

J'ai fait «revivre» cet article de la mine a écrit un peu "d'années. J'ai légèrement modifié, mettant à jour un petit peu ici et là, mais je pense qu'il est toujours pertinent et intéressant.

INTRODUCTION

Ce qui est un langage de développement? Un ordinateur, PC alias (Personal Computer), a un langage personnel. Ce langage est appelé code machine, signifiant que chaque machine, donc n'importe quel ordinateur (compatible PC, Apple, Unix, etc ...), a un. Uniques et brevetées Les programmes que nous voyons "run" sur nos PC sont principalement menées par l'objet mystérieux appelé un microprocesseur. C'est le cœur, le module intelligent, chaque ordinateur. En fait, une seule application ne fonctionne pas, mais est pris en charge par le microprocesseur, pour ainsi dire, à ce qu'on appelle un système d'exploitation: une couche logicielle fournie par le fabricant de la machine (voir, par exemple, le Macintosh d'Apple).

Suite ...

Les classes, les objets et les instances

J'ai remarqué souvent une confusion quand il s'agit de classes, des objets et des instances. Ceux qui ne sont pas très instruits sur la programmation orientée objet confond souvent la véritable signification de ces termes. Je savais, cependant, qu'il ya deux écoles de pensée concernant la définition des classes et objets. J'aime l '"école" qui indique la définition de la classe comme un sujet possible, et donc, comme une instance de l'objet.

Il semble trivial, mais je n'ai - parler avec d'autres - d'être en "conflit" (façon de parler) et tombent ensuite dans la confusion, quand on utilise ces termes, à partir de l'hypothèse que si quelque chose les «autres» comme on les entend .

Je le vois de cette manière, une classe est une définition! Il est définit précisément une classe d'objets possible. La classe est l'ensemble des méthodes et propriétés (si vous voulez, nous pouvons également ajouter des événements - Quoi d'autre ... non seulement que des méthodes spéciales) qui sera propriétaire de l'objet.

Par exemple, quand nous écrivons en Actionscript ou tout autre langage orienté objet:

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

Nous avons défini une classe et non un objet. Dans la limite que nous avons "défini" une "possible" l'objet. On pourrait même affirmer, à juste titre, que l'objet existe à l'exécution alors que la classe n'est pas (en vérité il ya des classes dynamiques qui peuvent être définies - et ensuite utilisé pour créer des objets - même à l'exécution). Exclure les classes statiques, bien sûr, que - finalement - ne sont rien de plus que des sous-instances (ou les instances cachée), puis des objets réels.

Mais quand nous avons:

1
MiaClasse = new MiaClasse ( ) ; var myObject: MaClasse = new MaClasse ();

! Voici mioOggetto est une instance de MiaClasse() ! . C'est mioOggetto est un sujet - en fait - de type MiaClasse() .

. En conséquence, leur philosophie à des objets, des objets de type MiaClasse() je peux en avoir autant que je veux, ce qui ne peut pas être - la définition même - de MiaClasse() . Par exemple, si le rapport est vrai et il est logique:

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

Cela n'a aucun sens:

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

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

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

Instance d'objet et, par conséquent, coïncident et sont utilisés en alternance pour la même signification dans des contextes différents.

Probablement quelqu'un se soucie pas beaucoup ... la question de l'exhaustivité des exigences ... :)

Suite ...

Ecrire une bonne code OO dans Adobe Flash

Voici quelques conseils sur la façon d'écrire de bonnes code orienté objet (OO) dans Adobe Flash, en particulier pour ceux qui utilisent encore la version MX attendant d'aller à CS3.

Organiser dossiers des classes

Tout d'abord, l'organisation des classes rend la maintenance du code du travail beaucoup plus facile. Vous pouvez également créer une véritable bibliothèque, vous pouvez réutiliser dans d'autres projets. Flash utilise une classification liée au système de fichiers, puis de les organiser en dossiers seront également reflétées sur l'importation de classes. Par exemple, si nous créons la séquence de dossiers "mylibrary / graphics / complot" et d'insérer notre propre classe ActionScript "PlotClass.as", alors que nous devrions utiliser pour importer la classe:

1
grafica . plot . PlotClass ; . importations mylibrary graphiques complot PlotClass..;

Si la bibliothèque (dossier) "MyLibrary" n'est pas dans votre dossier film ou projet, utilisez le flash des paramètres de publication pour sélectionner le chemin:

Réglage des bibliothèques percoroso

Suite ...