Artículos con la etiqueta "Orientado a Objetos"

Objective-C: propiedades de exponer en una clase

Me gustaría mostrar y discutir algunos ejemplos acerca de cómo agregar y manipular las propiedades de la clase Objective-C. : Un ejemplo clásico es, precisamente, lo siguiente, en la definición de nuestra clase de interfaz define dos propiedades nome y cognome :

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

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

retain ) NSString * nome; @ Propiedad (retener) NSString * nombre;
retain ) NSString * cognome; @ Propiedad (retener) NSString * nombre;
@ End

e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: En el archivo de la aplicación de la instrucción INSERT @synthesize lo que Xcode se producen para nosotros los métodos getter y setter , respectivamente, que se utiliza para leer y establecer las dos propiedades:

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

@ Implementación MyClass

@ Name Sintetizar y apellidos;

@ End

, possiamo scrive: Cuando usted va a utilizar la clase MyClass , que es cuando istanziaremo un objeto de tipo MyClass , se puede escribir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/ / Cualquier otra clase, como AppDelegate
/ / En el archivo. H
# Importar <UIKit/UIKit.h>
# Import "MyClass.h"

@ Clase TestViewController;

NSObject <UIApplicationDelegate> { @ Interface TesAppDelegate: NSObject {<UIApplicationDelegate>
UIWindow * ventana;
* TestViewController ViewController;

MyClass * miClase;
}

/ / En el archivo. M
MyClass alloc ] ; myClass = [MyClass alloc];
"Giovambattista" ; miaClasse.nome @ = "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "miaClasse.nome =% @", miaClasse.nome);

O, lo que es equivalente a:

1
2
3
/ / Siempre en la M archivo.
@ "Undolog" ] ; [SetNome myClass: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [nombre miClase]);

Hasta aquí todo bien. Sin embargo, podría inducir a error a la equivalencia de las "variables" internas (ivar) con el nombre de la propiedad en sí. Para entender la diferencia, proponer de nuevo lo mismo que hacerlo fuera, esta vez, la @synthesize . . Ahora, por lo tanto, debemos tener cuidado en escribir los métodos getter y setter . Para enfatizar aún más las diferencias, se cambie el nombre de las variables internas mediante la inserción de un guión bajo delante del nombre. Sin embargo, vemos el código:

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

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

NSString * ) nome; // get - ( NSString *) Nombre; / / obtener
NSString * ) cognome; // get - ( NSString *) Nombre; / / obtener

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

@ End

. A diferencia de los punteros antes de las variables internas (incapsultate) se han convertido en _nome y _cognome . . @property è scomparso, in quanto non serve più. Además hay cuatro definiciones de los métodos que representan nuestra get y set . @property ha desaparecido, ya que no necesita más.
Vemos el archivo de implementación 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"

@ Implementación MyClass

/ / Obtener un "nombre"
NSString * ) nome { - ( NSString *) Nombre {
_name Retorno;
}
/ / Set para "nombre"
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
_name StringaIngresso =;
}

/ / Obtener de "apellido"
NSString * ) cognome { - ( NSString *) Nombre {
_cognome retorno;
}
/ / Set para "apellido"
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ End

Escrito como una clase se puede utilizar exactamente igual que el anterior, a saber:

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);

/ / O, lo que equivale a:

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

e set , evidenziando – anche con l'aggiunta dell'underscore – le differenze tra il nome della proprietà e la sua ivar interna _nome . En el nivel de abandono educativo @synthesize nos obligó a escribir "su propia" métodos de get y set , destacando - incluso con la adición dell'underscore - las diferencias entre el nombre de la propiedad y su ivar interna _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. En el nivel funcional del uso personal de los métodos de get y set permite un control real de los datos antes de su puesta (o antes de su lectura) y un encapsulado real para proteger a la variable interna.
Por ejemplo, sería posible para impedir el paso de cadenas vacías a la propiedad nome :

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

Otra variación

Si desea utilizar las variables internas con el guión bajo delante (que rpoviene Adobe ActionScript puede ser utilizado también) no es necesario abandonar el uso de la directiva @synthesize . Xcode permite "fusionar" los métodos mencionados anteriormente:

1
2
_nome; Sintetizar @ name = _name;
_cognome; @ Name = Sintetizar _cognome;

. Al hacerlo, puede usar el puntero para las personas internamente _nome ", resumió" - en el exterior - como una propiedad de 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 . Por otra parte, es cierto que el uso de @synthesize produce la generación de métodos automáticos (mensajes) de getter y setter , también es cierto que si no las encuentra, por lo que si quieren "aplicar" un método para su getter y / o setter que usted puede hacer esto incluso si ha utilizado la directiva @synthesize .

Las asignaciones de memoria

En los ejemplos anteriores he omitido algunos detalles importantes para una implementación real. En primer lugar, no han mostrado ningún método init() , útil para la inicialización de objetos y valores por defecto. Por otra parte, está la adición de un método 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
/ / Archivo MyClass.m
# Import "MyClass.h"

@ Implementación MyClass

id ) init { - (Id) {init
self = [ super init ] ) { if (self = [super init]) {
"Nome preimpostato" ; _name @ = "Nombre del ajuste";
"Cognome preimpostato" ; _cognome @ = "Nombre del ajuste";
}
cambio sí;
}

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

NSString * ) nome { - ( NSString *) Nombre {
_name Retorno;
}
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") @ stringaIngresso = "sin nombre";
_name StringaIngresso =;
}

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

@ End

, etc… En el futuro veremos entonces los detalles de las propiedades readonly , retain , etc ... :)

Continuación ...

De ActionScript para Objective-C

Pensé que podría ser útil para aquellos que recientemente han abordado el desarrollo de aplicaciones para el iPhone de Apple, comparar Adobe ActionScript - el lenguaje usado en Adobe Flash y Adobe Flex, más común entre los neo-programadores - y el lenguaje Objective-C utilizado por Apple para desarrollar sus aplicaciones. Objective-C es en efecto un lenguaje orientado a objetos en el sentido puro, no es que no se actionscript, pero Objective-C es sin duda una ventaja, ya que es una extensión del estándar ANSI C y su sintaxis es una mezcla entre C / C + + y Smalltalk, es un verdadero OO (Object-Oriented Language).

Continuación ...

Sobrecarga

La sobrecarga es una característica muy útil de algunos lenguajes de programación a los objetos. Sin embargo tuti lenguajes orientados a objetos no lo soportan, y algunos de los "de aplicación" o limitada o diferente. En general, las funciones o métodos, la sobrecarga le permite crear dos o más funciones / métodos que tienen el mismo nombre, pero aceptan diferentes parámetros, por ejemplo:

Continuación ...

Lenguajes de programación

I "revivió", escribió este artículo mío un poco "de años atrás. I revisado ligeramente, la actualización de un poco aquí y allá, pero creo que sigue siendo pertinente e interesante.

INTRODUCCIÓN

¿Qué es un lenguaje de programación? Una computadora, también conocido como PC (Personal Computer), tiene un lenguaje personal. Este lenguaje se llama código de máquina, en el sentido de que cada máquina, por lo que cualquier ordenador (PC compatible, Apple, Unix, etc ...), tiene una. Único y exclusivo Los programas que vemos "run" en nuestro PC se lleva a cabo principalmente por el misterioso objeto llamado microprocesador. Este es el corazón, el módulo inteligente, cada equipo. De hecho, sólo una aplicación no se está ejecutando, pero es apoyado por el microprocesador, por así decirlo, a lo que se llama un sistema operativo: una capa de software suministrado por el fabricante de la máquina (véase, por ejemplo, el Apple Macintosh).

Continuación ...

Clases, objetos e instancias

Me di cuenta de la confusión a menudo cuando se trata de clases, objetos e instancias. Los que no son muy educados en la programación orientada a objetos a menudo se confunde el verdadero significado de estos términos. Sabía, sin embargo, que hay dos escuelas de pensamiento acerca de la definición de clases y objetos. Me gusta la "escuela" que indica la definición de clase como sujeto posible, y por lo tanto, como una instancia del objeto.

Parece trivial, pero he I - hablar con los demás - a estar en "conflicto" (por así decirlo) y luego caer en la confusión, cuando se utilizan estos términos, a partir de la suposición de que en todo caso el "otro" del mismo modo que ellos pretenden .

Yo lo veo de esta manera, una clase es una definición! Es precisamente define una clase de objetos posibles. La clase es el conjunto de métodos y propiedades (si quieres también podemos añadir eventos - ¿qué otra cosa ... no sólo que los métodos especiales) que será el propietario del objeto.

Por ejemplo, cuando escribimos en Actionscript, o cualquier otro lenguaje orientado a objetos:

1
2
3
4
class MiClase {
MiaClass función () {}
miMetodo function () {}
}

Hemos definido una clase y no un objeto. En el límite que tenemos ", definido" a "posible" objeto. Incluso, podría argumentar, con razón, que el objeto existe en tiempo de ejecución, mientras que la clase no (en realidad no son clases dinámicas que se pueden definir - y luego se utiliza para crear objetos - incluso en tiempo de ejecución). Excluir a las clases estáticas, por supuesto, que - al final - no son más que sub-casos (o instancias ocultas) y luego los objetos reales.

Pero cuando se tiene:

1
MiaClasse = new MiaClasse ( ) ; var myObject: MiClase = new MyClass ();

! Aquí mioOggetto es una instancia de MiaClasse() ! . Que mioOggetto es un tema - de hecho - de tipo MiaClasse() .

. Como resultado de ello, su filosofía a los objetos, los objetos de tipo MiaClasse() que puede tener tanto como yo quiero, que no puede ser - la definición misma - de MiaClasse() . Por ejemplo, si el informe es cierto y tiene sentido:

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

No tiene ningún sentido:

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

class MiClase {
MiaClass función () {}
MioMetodo_2 function () {}
}

class MiClase {
MiaClass función () {}
MioMetodo_3 function () {}
}

Instancia de objeto y, por tanto, coinciden y se utilizan alternativamente para el mismo significado en diferentes contextos.

Probablemente a nadie le importa ... no mucho la cuestión de la integridad de los requisitos ... :)

Continuación ...

Escribir buen código orientado a objetos en Adobe Flash

Estos son algunos consejos sobre cómo escribir un buen código orientado a objetos (OO) en Adobe Flash, especialmente para aquellos que siguen utilizando la versión MX de espera para ir a CS3.

Organizar las carpetas de las clases

En primer lugar, la organización de las clases hace que el trabajo mucho más fácil el mantenimiento del código. También puede crear una biblioteca real se puede reutilizar en otros proyectos. Flash utiliza una clasificación relacionada con el sistema de archivos, y luego organizarlos en carpetas también se verá reflejado en la importación de clases. Por ejemplo, si creamos la secuencia de las carpetas "MyLibrary / gráficos / parcela" e insertar nuestra propia clase de ActionScript "PlotClass.as", cuando deberíamos usar para importar la clase:

1
grafica . plot . PlotClass ; . importaciones MyLibrary gráficos trama PlotClass..;

Si la biblioteca (carpeta) "MyLibrary" no está en la carpeta de película o proyecto, utilice el flash la configuración de publicación para seleccionar la ruta:

Establecer percoroso bibliotecas

Continuación ...