Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-04-2005
PeLuCa PeLuCa is offline
Miembro
 
Registrado: abr 2005
Posts: 20
Poder: 0
PeLuCa Va por buen camino
Unhappy 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.
Responder Con Cita
  #2  
Antiguo 03-04-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por PeLuCa
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

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:
Código Delphi [-]
interface
type
  TImpresora = class(TObject)
  public
    procedure Imprimir; virtual; abstract;
  end;

  TEpson = class(TImpresora)
  public
    procedure Imprimir; override;
  end;

  THasar = class(TImpresora)
  public
    procedure Imprimir; override;
  end;

implementation

{ THasar }

procedure THasar.Imprimir;
begin
  ShowMessage('THasar.Imprimir');
end;

{ TEpson }

procedure TEpson.Imprimir;
begin
  ShowMessage('TEpson.Imprimir');
end;

procedure Imprimir(AImpresora: TImpresora);
begin
  AImpresora.Imprimir;
end;

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 03-04-2005 a las 21:46:07.
Responder Con Cita
  #3  
Antiguo 04-04-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por PeLuCa
... 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.
La exposición que has hecho es correcta, todo, excepto que te sea necesario el CAST. Justo al haber hecho el Create (**) como objeto TEpson ya lo tienes solucionado.

Código Delphi [-]
 var
   impresora : TImpresora;
 begin
   impresora := TEpson.Create();
   impresora.Imprimir;
   impresora.Free;

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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 04-04-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 04-04-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por jachguate
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
De hecho antes de este error debe aparecer el de que no es posible usar abstract sin virtual o dynamic.

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
Responder Con Cita
  #6  
Antiguo 04-04-2005
PeLuCa PeLuCa is offline
Miembro
 
Registrado: abr 2005
Posts: 20
Poder: 0
PeLuCa Va por buen camino
Angry Algo asi esperaba

Cita:
Empezado por Neftali
La exposición que has hecho es correcta, todo, excepto que te sea necesario el CAST. Justo al haber hecho el Create (**) como objeto TEpson ya lo tienes solucionado.

Código Delphi [-]
  var
    impresora : TImpresora;
  begin
    impresora := TEpson.Create();
    impresora.Imprimir;
    impresora.Free;

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.
Supuestamente eso seria lo mejor, pero no ocurre de esa manera, cuando digo impresora := TEpson.Create(); y luego quiero acceder a los metodos de TEpson no me deja solo puedo acceder a los de TImpresora. No se donde le estoy errando. Gracias.
Responder Con Cita
  #7  
Antiguo 04-04-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por PeLuCa
y luego quiero acceder a los metodos de TEpson no me deja solo puedo acceder a los de TImpresora.
Pero esto no es lo mismo que has planteado originalmente. Con una variable de tipo TImpresora, aun cuando haya sido construida con la clase TEpson, sólo podrás acceder, a menos que uses el moldeo de tipos, a los métodos declarados en la clase base, nunca a los de un descendiente.

// Saludos
Responder Con Cita
  #8  
Antiguo 05-04-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

Cita:
Empezado por roman
sólo podrás acceder, a menos que uses el moldeo de tipos, a los métodos declarados en la clase base, nunca a los de un descendiente.
Según se entiende del mensaje original, es precisamente esto lo que se busca, ¿no?... y precisamente esto también es lo que se lllama Polimorfismo.

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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #9  
Antiguo 05-04-2005
PeLuCa PeLuCa is offline
Miembro
 
Registrado: abr 2005
Posts: 20
Poder: 0
PeLuCa Va por buen camino
Thumbs up Por Fin!!!!!!!!!!.

Cita:
Empezado por jachguate
Según se entiende del mensaje original, es precisamente esto lo que se busca, ¿no?... y precisamente esto también es lo que se lllama Polimorfismo.

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.

Ahora que si me dio, no se que problema pude haber tenido que antes n daba con la tecla pero probando lo que tu me dices, que creia haberlo probado, encontre la simple solucion, Gracias por abrirme los ojos.
Saludos.
Responder Con Cita
  #10  
Antiguo 05-04-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por jachguate
Según se entiende del mensaje original, es precisamente esto lo que se busca, ¿no?... y precisamente esto también es lo que se lllama Polimorfismo.

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.
Sé lo que es el polimorfismo. Para mi lo que era confuso era la frase

"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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 00:24:13.


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
Copyright 1996-2007 Club Delphi