Domanda

sto insegnando me stesso Objective-C come un piacere colpevole, se si farebbe. Ho un sedicente stretta forte del linguaggio Java, quindi non è un terribilmente difficile di transizione - è sicuramente divertente però. Ma, ahimè, la mia domanda!

Sto tentando di riprodurre qualcosa che esiste in PHP: Tardo binding statico. In PHP, posso decorare una chiamata di metodo con "statico ::", che dinamicamente legano tale metodo per il chiamante in fase di esecuzione. D'altra parte, se si usa la parola "self ::", l'associazione è statico ed è associato con la classe in cui si trova, indipendentemente dalla classe figlio lo chiama.

In Obj-C, sto avendo difficoltà a riprodurre questo paradigma. Ho chiesto al mio signore, Google, come alla fine di associare in modo statico in Cocoa, ma non credo sia possibile. Può essere chiamato qualcos'altro, oppure può richiedere una soluzione molto over-my-testa. Ecco quello che sto facendo ora:

Parent metodo della classe:

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

Una classe figlia, ChildClass, si estende ParentClass e non sovrascrive metodo di istanza whoami.

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

Quando invio il messaggio a ciascuno degli oggetti di classe, vincolante dinamica fa quello che dovrebbe fare, e ottengo il seguente da NSLog ():

2010-09-21 11: 39: 07,484 WhoAmI [4803 a0f] Chiamata dal padre: Parent
2010-09-21 11: 39: 07,486 WhoAmI [4803 a0f] Chiamata dalla CHILD: Bambino

In definitiva, voglio imparare - se possibile - come raggiungere cacao per fermare vincolante in modo dinamico in modo che il metodo WHOAMI restituisce sempre l'oggetto in cui si trova (sempre Parent). Voglio anche che sia un metodo di istanza. Come potrei fare per fare questo?

-Sean

È stato utile?

Soluzione

In realtà Objective C è un potente set di funzioni di introspezione, ed è quasi certamente possibile fare quello che vuoi facendo riferimento alla vasta Objective C runtime documentazione . Si tratta di un API completa C per accedere ai meccanismi interni di gerarchia di oggetti e di classe Obiettivo di C.

Se non altro, con la sperimentazione di questa roba imparerete molto su come funziona il linguaggio e dovrebbe aiutare il debug di problemi difficili.

Altri suggerimenti

Cambia il metodo per incorporare il nome della classe genitore (o la superclasse):

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

Si dà il caso che quello che ho voluto creare doveva essere determinata da staticamente vincolante il mio messaggio di classe alla classe madre stessa:. Parent

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top