Il messaggio Objective-C passa le query correlate

0

Sto imparando l'obiettivo-C dopo aver acquisito una buona conoscenza di C / C ++. Ho 2 domande:

  1. I messaggi obj-C passano e C ++ vtable, due modi diversi di implementare il polimorfismo o sono due concetti molto diversi che ho interpretato erroneamente in diverse implementazioni dello stesso concetto?

  2. Ho letto la seguente riga di questo pdf link

    Polymorphism takes a pluralistic point of view and notes that several classes can each have a method with the same name. Argument overloading takes the point of the view of the method name and notes that it can have different effects depending on what kind of object it applies to

    In sostanza entrambi fanno ciò che vogliamo da loro, cioè chiamando il metodo in base all'oggetto. Qual è la differenza allora?

posta codecool 25.05.2012 - 15:45
fonte

4 risposte

4
  1. Entrambe sono varianti di invio dinamico (ovvero sovraccarico risolto al momento dell'esecuzione).

  2. Il sovraccarico è per me (non sono un originale, è classificazione Cardelli e Weger ) una sorta di polimorfismo. Non sono sicuro di capire cosa si possa intendere qui. Se sto indovinando correttamente, la tua citazione sta facendo la differenza tra il "polimorfismo" che verrebbe sovraccaricato sullo speciale parametro this risolto al momento dell'esecuzione usando il tipo dinamico dell'argomento e "sovraccarico" che verrebbe sovraccaricato sul altri parametri risolti in fase di compilazione (e quindi utilizzando il tipo statico degli argomenti).

risposta data 25.05.2012 - 16:13
fonte
2

Che cosa ha detto l'AProgrammer , con uno aggiunta cruciale : il messaggio che passa (a la Smalltalk, Objective-C, Ruby) consente l'inoltro di un messaggio (per i proxy trasparenti) o anche la generazione di runtime di un metodo che implementa quel messaggio.

Sto usando la terminologia Smalltalk, dove un messaggio è il nome della funzione / metodo invocato. La gente obiettiva-C probabilmente chiamerebbe questo il selettore. Quando un oggetto riceve un messaggio, cerca in un dizionario di metodo un metodo corrispondente al nome del messaggio - una funzione che in realtà fa qualcosa. Se non viene trovato alcun metodo, viene eseguito #doesNotUnderstand: dell'oggetto (Smalltalk) o :method_missing? (Ruby) o - forwardInvocation: (Objective-C).

Quindi, un oggetto che riceve un messaggio che non capisce può reagire a quell'oggetto in modi arbitrari. Ciò include, alla ricezione di tale messaggio, la creazione di un metodo in grado di gestire questo messaggio e l'installazione di tale metodo nel dizionario dei metodi dell'oggetto.

(Questo è sicuramente possibile in Smalltalk dove normalmente un compilatore è sempre disponibile, probabilmente è in Ruby, dove hai instance_eval / class_eval . Non so se sia possibile in Objective-C; non conosco abbastanza bene la lingua.)

Queste cose non sono possibili nelle lingue che usano la ricerca vtable.

    
risposta data 25.05.2012 - 16:22
fonte
1

Sono meccanismi molto, molto diversi che forniscono funzionalità molto diverse.

Il meccanismo di invio virtuale C ++ è come un puntatore a funzione. Il compilatore C ++ genera una funzione di costruzione che riempie una tabella thunking con i puntatori per chiamare le funzioni. La ricerca è veloce come chiamare void (*) (). Questo è completamente statico e non consente di sostituire le funzioni durante il runtime (sebbene ciò potrebbe probabilmente essere fatto) espandendo la funzionalità o fornendo una ricerca simbolica come @signature("helloWorld") . Se vuoi farlo in C ++ devi scriverlo, come fa Qt e ha un moc che genera lo schifo che deve accadere.

Il sistema di messaggi Objective-C è completamente diverso. C'è questo objc_msg_lookup o qualsiasi altra funzione. Perché in Objective-C i messaggi a cui un oggetto può rispondere possono cambiare al volo, durante il runtime, non c'è assolutamente modo di costruire un dispatch virtuale come ha C ++. Invece si ha una sorta di id di messaggio, magari anche una stringa poiché il sistema deve anche essere in grado di trovare le firme @ o qualunque cosa fossero, che viene ricercata ogni volta che si effettua una chiamata. Questo è il motivo per cui il linguaggio ha l'aspetto IMPL che ti fornisce un puntatore a funzione per chiamare quando ti trovi in un ciclo chiuso o qualcosa del genere.

Sono passati anni da quando ho lavorato in Objective-C ma dubito strongmente che sia cambiato.

Quale è meglio? Né. Ognuno è migliore per cose diverse.

    
risposta data 25.05.2012 - 18:04
fonte
1

Are they two very different concepts which I have misinterpreted into different implementations of same concept?

Hanno essenzialmente lo stesso scopo. È come la differenza tra chiodi e viti: è possibile fissare due schede insieme, ma funzionano in modo diverso.

What is the difference then?

Una differenza si trova in cui oggetti è possibile inviare un determinato messaggio a. In C ++, il compilatore si lamenterà se si tenta di chiamare un metodo che l'oggetto di destinazione non implementa. In Objective-C, il compilatore non si cura - il metodo che viene chiamato quando si invia un messaggio a qualche oggetto non viene determinato fino a quando il programma è in esecuzione e il messaggio viene effettivamente inviato.

    
risposta data 26.05.2012 - 00:06
fonte

Leggi altre domande sui tag