Herencia y Casteo
Hola, que tal, mi primer mensaje al foro, espero que alguno me pueda dar una mano, tengo la siguiente herencia:
TImpresora = class(TObject) private public imprimir();abstract; end; TEpson = class(TImpresora) private public imprimir();override; end; THasar = class(TImpresora) private public imprimir();override; end; hasta ahi todo bien, el problema esta en que en la aplicacion donde uso las impresoras tengo un form de configuro la que quiero usar, el tema es como en la aplicacion se que objeto tengo que crear el TEpson o el THasar. La idea es crear un objeto que me permita abstraerme de que impresora es y solo invocar el metodo imprimir, y listo. Cuando defino un objeto impresora : TImpresora en la app, y al momento del create() le digo impresora := TEpson.Create(), pero cuando en otro necesito hacer uso del metodo imprimir no lo puedo hacer, una de las soluciones era castear el objeto impresora : TEpson(impresora).imprimir() pero seguimos en la mismo situacion debo conocer la clase del objeto de la impresora activa. Les agradeceria alguna sugerencia que me saque de la nube donde estoy. Saludos. |
Cita:
Estas hablando de utilizar uno de los pilares de la programación orientada a objetos: El Polimorfismo. Lo que tu dices tiene que funcionar, lo usamos todos los programadores con regulariada, y no entiendo porque dices que no puedes llamar al método print, aquí tienes un ejemplo un poco extendido:
Saludos! |
Cita:
Un código como éste te devolvería el cuado con el texto: TEpson.Imprimir sin necesidad de CAST, justo por cómo has realizado la creación del objeto. |
Como podes deducir de lo publicado por delphi.com.ar, el problema es que en la clase padre: TImpresora el método Imprimir no es virtual. De hecho, estoy seguro que delphi debiera mostrar un mensaje de error al intentar compilar el código que publicaste, puesto que el método sobreescrito (override) en las clases hijas no existe en la tabla de métodos virtuales de la clase padre (pero esto es solo una suposición).
Hasta luego. ;) |
Cita:
Esto, junto con el hecho de que ni siquiera aparece procedure en la declaración del método hace pensar que PeLuCa sólo está mostrando de forma esquemática su jerarquía y para entender exactamente cuál es el problema lo recomendable es que pusiera la declaración exacta y compilable. // Saludos |
Algo asi esperaba
Cita:
|
Cita:
// Saludos |
Cita:
Al final de cuentas, el que se terminará ejecutando es el método Imprimir de la clase TEpson, aún cuando se halla llamado desde un objeto referenciado por una variable de la clase TImpresora. Hasta luego. ;) |
Por Fin!!!!!!!!!!.
Cita:
Saludos. |
Cita:
"acceder a los metodos de TEpson " que puede tener dos interpretaciones: el acceso a los métodos propios de la clase TEpson (los declarados a ese nivel) o el acceso a los métodos redefinidos en la clase TEpson. En el segundo caso entra el polimorfismo, no así en el primero. Y si insistí era precisamente porque algo que en principio era claro para todos, incluido PeLuCa, parecía no funcionar, de manera que había que revisar que estuviéramos hablando de lo mismo. Felizmente ya lo resolvió. // Saludos |
La franja horaria es GMT +2. Ahora son las 06:57:01. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi