Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Herencia y Casteo (https://www.clubdelphi.com/foros/showthread.php?t=20019)

PeLuCa 03-04-2005 17:56:28

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.

delphi.com.ar 03-04-2005 21:31:27

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

:confused:
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!

Neftali [Germán.Estévez] 04-04-2005 09:43:38

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.

jachguate 04-04-2005 18:31:56

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.

;)

roman 04-04-2005 18:43:02

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

PeLuCa 04-04-2005 23:08:38

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.

roman 04-04-2005 23:24:16

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

jachguate 05-04-2005 00:12:37

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.

;)

PeLuCa 05-04-2005 01:20:01

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.

roman 05-04-2005 01:29:15

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


La franja horaria es GMT +2. Ahora son las 06:24:54.

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