¿Cómo funciona exactamente el envío a "self" y "super"?

Por favor, ayúdenme a aclarar esto sobre los métodos de instancia en Objective C:

  • Puede enviar mensajes a self y super dentro
    • ambos envían el mensaje al objeto que llama, pero usan diferentes implementaciones
    • si una superclase suya llama a un método en self, [ejecutará] su implementación (si existe)

Conferencia 3, Universidad de Stanford, curso Objectve-C

preguntado el 10 de marzo de 12 a las 10:03

¿Podría al menos copiar la cita de la conferencia correctamente? No puedo entender tu versión. -

Está copiado literalmente de la conferencia... Está hablando de métodos de instancia por cierto Página 9 en ese enlace -

No, no lo fue. Era ininteligible sin el formato correcto. (Gracias @sch) -

¿Pero eso tiene que ver con el título que cambiaste?... Y todavía no entiendo esto .___. si una superclase suya llama a un método en sí mismo, [ejecutará] su implementación (si existe) -

No edité el título originalmente, pero este nuevo debería funcionar. -

1 Respuestas

Bien, ahora que es realmente posible entender la pregunta:

Digamos que tienes una clase Foo con métodos doSomething y doSomethingElse, y creas una subclase de Foo llamado Bar.

En su implementación de Bar, si quisieras llamar doSomething podrías hacer [self doSomething] or [super doSomething].

  • [super doSomething] usaría la implementación de la superclase de doSomething-específicamente, Fooimplementación.
  • [self doSomething] usaría la implementación de la clase misma de doSomething-es decir, Barla implementación de . Tenga en cuenta que si Bar en realidad no anuló doSomething, entonces [self doSomething] terminaría llamando a la implementación de la superclase.

En cuanto a lo que sucede si una superclase llama a un método en self, digamos Bar anula doSomething, pero no anula doSomethingElse, y digamos doSomethingElse Se ve como esto:

- (void)doSomethingElse
{
    [self doSomething];
}

Que pasa si llamas doSomethingElse on Foo *aFoo y Bar *aBar? El resultado de [aFoo doSomethingElse] es claro: lo hace [self doSomething] dónde self es un Foo, asi que Fooimplementación de doSomething será ejecutado.

Pero cuando lo haces [aBar doSomethingElse] es donde las cosas se ponen interesantes, y es a lo que Paul se refería. ya que Bar no anula doSomethingElse, Foose llamará la implementación de , que a su vez no [self doSomething]. Pero esta vez, self es una instancia de Bar, y entonces BarSe llamará a la implementación de doSomething.

Por qué [self doSomething] en la implementación de Foo termina ejecutando código de la subclase Bar? Esto se debe a cómo se envían los mensajes en Objective-C. [self doSomething] envía el mensaje doSomething al objeto self, y depende de cualquier objeto self es decidir qué código se ejecuta. Ya que self, en esta situación, sería un Bar, Barimplementación de doSomething es ejecutado.

respondido 10 mar '12, 13:03

Eso torció mi cabeza sobre .___. Comenzando desde aquí: Entonces, cuando Bar llama a doSomethingElse, en realidad ejecuta doSomethingElse de la superclase, que a su vez hace que la superclase llame [self doSomething], pero eso termina ejecutando la implementación de doSomething de la subclase, no la de la superclase. ¿No se llama el de la superclase? entonces superclase se llama a sí misma? Entonces, ¿por qué se ejecuta la subclase uno? - ElNavigat

@TheNavigator solo pruébalo y compruébalo por ti mismo. Es tan fácil hacer eso de todos modos. - Albus Dumbledore

Entonces, si Bar tiene una implementación de ese mensaje, anulará a Foo. Si no, entonces Foo funcionaría, debido a la herencia ¿Es así? - ElNavigat

@AlbusDumbledore Quiero entender cómo funciona primero: | - ElNavigat

¡AL FINAL! ¡Gracias Yuji! :) Oh, última pregunta, entonces, ¿cómo "forzar" el mensaje de Foo para que funcione? - ElNavigat

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.