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 15-02-2011
annieruci annieruci is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 32
Poder: 0
annieruci Va por buen camino
Casting

Me hace falta saber como puedo hacer un casting, tengo una clase persona, una clase estudiante y otra profesor, estas dos ultimas heredan de persona y ahora me hace falta meter los objetos en una lista de tipo persona y resulta que cuando intento acceder a los metodos de los hijos no me deja, como casteo para si es del tipo estudiante entre a un metodo y si es de tipo profesor entre a otro metodo

Saludos
Responder Con Cita
  #2  
Antiguo 15-02-2011
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
Código Delphi [-]
var
clase : TPersona;
begin
  if (clase is TEstudiante) then
    TEstudiante(clase).do_something
  else
    TDocente(clase).do_something_more;    
end;
__________________
self.free;
Responder Con Cita
  #3  
Antiguo 16-02-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Para algunos casos en particular, el uso del operador is puede dar resultados no esperados, ya que este devuelve verdadero
tanto si el objeto pertenece a la clase, como si es desciende de ella.

Por ejemplo:
Código Delphi [-]
var
  Clase: TPersona;
begin
  Clase:= TAlumno.Create;
  if Clase is TPersona then
    ShowMessage('TPersona')
  else if Clase is TDocente then
    ShowMessage('TDocente')
  else
    ShowMessage('TAlumno');
end;
Que muestra el mensaje 'TPersona' cuando el objeto creado es un TAlumno.

O también:
Código Delphi [-]
var
  Clase: TPersona;
begin
  Clase:= TAlumno.Create;
  if Clase is TAlumno then
     ShowMessage('TAlumno');
  if Clase is TDocente then
     ShowMessage('TDocente');
  If Clase is TPersona then
     ShowMessage('TPersona')
end;
Donde la salida es 'TAlumno' y 'TPersona'.

En casos que pueden prestarse a confusiones, una buena alternativa es usar la función ClassType que nos da dinámicamente
la referencia de clase del objeto:
Código Delphi [-]
var
  Clase: TPersona;
begin
  Clase:= TAlumno.Create;
  if Clase.ClassType = TPersona then
     ShowMessage('TPersona');
  if Clase.ClassType = TDocente then
     ShowMessage('TDocente');
  if Clase.ClassType = TAlumno then
     ShowMessage('TAlumno');
end;

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 16-02-2011 a las 08:25:12.
Responder Con Cita
  #4  
Antiguo 16-02-2011
annieruci annieruci is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 32
Poder: 0
annieruci Va por buen camino
Gracias

Gracias por la ayuda!!!!!!!!!
Responder Con Cita
  #5  
Antiguo 16-02-2011
annieruci annieruci is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 32
Poder: 0
annieruci Va por buen camino
Error

Código Delphi [-]
for i:=0 to Length(lista)-1 do
begin
    if lista[i].ClassType = TEstud then
       edit4.text:= inttostr(lista[i].Getasignaturas);
end;
Me da error al llamar al metodo del hijo!!!!

Última edición por ecfisa fecha: 16-02-2011 a las 20:32:03. Razón: ETIQUETAS DELPHI
Responder Con Cita
  #6  
Antiguo 16-02-2011
annieruci annieruci is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 32
Poder: 0
annieruci Va por buen camino
Resuelto

Ya se arreglo gracias a ustedes

Saludos
Responder Con Cita
  #7  
Antiguo 16-02-2011
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 annieruci Ver Mensaje
resulta que cuando intento acceder a los metodos de los hijos no me deja, como casteo para si es del tipo estudiante entre a un metodo y si es de tipo profesor entre a otro metodo
Quizá, y sólo quizá, haya que replantear el problema. En teoría, si tu vas a procesar una lista de objetos, deberías restringirte únicamente a las operaciones permitidas para el objeto genérico sin preocuparte por la clase específica heredada.

Esto no quiere decir que no puedas efectuar operaciones de acuerdo a la clase específica. Pero de ello se encarga el polimorfismo. Si tu clase Persona tiene un método (virtual) HazEsto, las clases derivadas (Estudiante, Profesor, etc.) pueden redefinir dicho método para adaptarse a sus necesidades específicas.

Entonces, puedes recorrer la lista en forma genérica:

Código Delphi [-]
for I := 0 to ListaPersonas.Count -1 do
  ListaPersonas[i].HazEsto;

con la seguridad de que, dependiendo del objeto, se llamará al método correcto.

// 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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
problema con casting/tipo money en postgreSQL viaraSOFT.com SQL 4 16-02-2011 17:41:54
Cómo prescindir del "casting" de tipos Luis_264 Varios 8 03-01-2009 22:01:03
casting Composite Report: error al imprimir MsYo Impresión 2 24-07-2006 12:29:09
Def. de constantes - Casting Mariana OOP 3 21-10-2005 19:24:23
Casting de TComponent en TEdit jamonete2 Varios 2 12-06-2005 15:56:19


La franja horaria es GMT +2. Ahora son las 01:09:09.


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