Pregunta

Estoy enseñando a mí mismo Objective-C como un placer culpable, si lo haría. Tengo un buen conocimiento autoproclamado del lenguaje Java, así que no es un terriblemente difícil transición - seguro que es divertido sin embargo. Pero, por desgracia, mi pregunta!

Estoy intentando reproducir algo que existe en PHP: la ligadura estática. En PHP, puedo decorar una llamada al método con "estática ::", que se unen de forma dinámica que el método de la persona que llama en tiempo de ejecución. Por otro lado, si se utiliza la palabra clave "self ::", la unión es estática y se asocia con la clase en la que reside, independientemente de la clase hija lo llama.

En Obj-C, estoy teniendo dificultades para reproducir este paradigma. Le he pedido a mi supremo, Google, cómo se unen tarde estáticamente en Cocoa, pero no creo que sea posible. Se le puede llamar otra cosa, o puede requerir una solución muy sobre-mi-cabeza. Esto es lo que estoy haciendo ahora:

Parent método de las clases:

-(id) whoAmI {
 return ([self class]);
}

Una clase niño, ChildClass, se extiende ParentClass y no anula método de instancia whoAml.

NSLog(@"Calling from PARENT: %@", [parent whoAmI]);
NSLog(@"Calling from CHILD: %@", [child whoAmI]);

Cuando envío del mensaje a cada uno de los objetos de la clase, la unión dinámica hace lo que tiene que hacer, y me da lo siguiente de NSLog ():

2010-09-21 11: 39: 07,484 WhoAmI [4803: a0f] Llamar desde PADRES: Padres
2010-09-21 11: 39: 07,486 WhoAmI [4803: a0f] Llamar desde NIÑO: Niño

Por último, quiero aprender - si es posible - como llegar Cacao para detener la dinámica vinculante para que el método whoAml siempre devuelve el objeto en el que reside (siempre Padres). También quiero que sea un método de instancia. ¿Cómo voy a ir haciendo esto?

-Sean

¿Fue útil?

Solución

En realidad Objetivo C tiene un potente conjunto de características de introspección, y es casi seguro que sea posible para hacer lo que quiera, haciendo referencia a la extensa Objetivo C Tiempo de ejecución documentación . Se trata de una completa API C para acceder a los mecanismos internos de jerarquía de objetos y clases de C Objetivo.

Por lo menos, mediante la experimentación con este material que va a aprender mucho acerca de cómo funciona el idioma y que debería ayudar en la depuración de problemas difíciles.

Otros consejos

Cambiar el método para incorporar el nombre de la clase padre (o la superclase):

-(id) whoAmI {
 return ([Parent class]);    //In this instance, Parent is the superclass
}

Lo que pasa es que lo que deseaba crear tuvo que ser provocada por la unión estáticamente mi clase de mensaje a la clase padre sí:. Principal

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top