Modificar el tipo de una variable heredada

Hace unos días preguntaba en ASNativos si en AS3 se podía cambiar el tipo de una variable heredada. En concreto cambiar el tipo a una clase que hereda de la original. Pues parece que no es posible.

Es decir, tengo clase B que hereda de A. Clase A tiene una propiedad tipo X y yo quiero que la clase B modifique el tipo de X a un hijo de X (sí, este párrafo se entiende peor que el anterior).

¿Y para qué? Pues para ZCode. En mi MVC base tanto el modelo como la vista tienen una instancia del otro. Ahora, la aplicación Pepito tienen las clases PepitoModel y PepitoView por lo que la instancia de la vista de PepitoModel debe ser tipo PepitoView, no View. Es precisamente por eso que NO me vale una interface ya que no sé a priori qué métodos va a necesitar PepitoView. Me vale lo que hacía en AS2, modificar el tipo de una variable al heredar, como aquí:

Modelo/vista general:

http://code.google.com/p/zcode/source/browse/trunk/as2/tv/zarate/application/Model.as
http://code.google.com/p/zcode/source/browse/trunk/as2/tv/zarate/application/View.as

Modelo/vista específico:

http://code.google.com/p/zcode/source/browse/trunk/as2/tv/zarate/projects/webv3/WebModel.as
http://code.google.com/p/zcode/source/browse/trunk/as2/tv/zarate/projects/webv3/WebView.as

Pues parece que no es posible en AS3. Lo mejor que me he encontrado es hacer algo como esto:

private function get view():PepitoView{
return _view as PepitoView;
}

Pero claro, entonces PepitoView tiene 2 variables _view y view, lo cual es una mala ñapa. Como dice Cay la otra sería utilizar view:*, no sé qué es menos malo.

¿Otra ideas felices? ¿Algún superpatrón al rescate?

Educa al friki

6 Responses to “Modificar el tipo de una variable heredada”

  1. Freddie Says:

    Puede que no haya entendido un carajo de tu problema, pero… override?

  2. Zárate Says:

    Al hacer el override en la clase hija (protected en la principal) el compilador protesta diciendo que no se puede cambiar el tipo :|

  3. Manuel Says:

    Hola, una cosilla, si no entiendo yo mal.

    Si PepitoView hereda de View, ¿no te vale con hacer view:View? ¿Y luego asignarle una instancia de PepitoView?

    o hacer un interfaz IView, y hacer view:IView con el mismo motivo: asignar una instancia de PepitoView.

    Igual no te vale, pero es una solución, ¿no?

  4. Fernando Quintero Says:

    Hola,

    Lo único que se me ocurre además de las dos soluciones propuestas (más limpia la primera con diferencia) es hacer el casting a la variable para hacer una conversión explícita, aunque sería lo mismo -casi- que utilizar el “as”:
    PepitoView(view);

    ó view:Object (que es un pelín menos ñapa que usando el *).

    Si quieres hacer algo más “serio” yo tiraría por usar (adaptándolo a Flash):

    http://www.cristalab.com/tips/46615/clase-para-convertir-tipos-de-datos-en-flex.html

  5. Joan Garnet Says:

    Mi visión del tema…
    Un framework estructural como el que propones no tiene porqué satisfacer todas sus posibles implementaciones, solo ofrecer una estructura lo suficientemente flexible como para que se puedan construir tantas aplicaciones dentro de su dominio como sea necesario.
    Entonces a mi parecer el utilizar una interfaz (IView?) a implementar por todas las vistas debería ser suficiente. O si se dispone de una clase base (View) quizás ésta sería más adecuada.
    En las distintas implementaciones de View se tendría que hacer un downcasting al tipo que fuera conveniente (PepitoView).
    Esto es lo que a mi personalmente me parece más correcto (coincidiendo plenamente con Manuel).

    un saludo!

  6. Sergio Daroca Says:

    Mi granito de arena…
    Si tu modelo y tu vista tienen cada uno una instancia del otro, supongo que es para comunicarse, o utilizar cada uno datos o métodos del otro, no?
    En AS2 yo vengo utilizando el notificationCenter de ASAP Framework, para comunicar entre diferentes clases o partes de la aplicación que no tienen porque conocerse entre sí:

    http://asapframework.org/api-trunk/org_asapframework_events_notificationcenter_NotificationCenter.html

    Y acaban de sacar una versión para AS3. La puedes bajar por SVN:

    http://asaplibrary.googlecode.com/svn/trunk

    Igual es demasiado cambio para la estructura que tienes, pero en este caso, por ejemplo, te permitiría independizar a la vista y el modelo del todo. Con lo cual te daría igual de qué tipo es cada cual.

    saludos !

Leave a Reply