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
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
  #5  
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
  #6  
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
  #7  
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
  #8  
Antiguo 16-02-2011
annieruci annieruci is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 32
Poder: 0
annieruci Va por buen camino
respuesta

Código Delphi [-]
for i:=0 to Length(lista)-1 do
begin
    if lista[i].ClassType = TEstud then
      edit4.text:= inttostr((lista[i] as TEstud).Getasignaturas);
end;
Lo que dice roman es muy util pero no para mi caso ya que no tiene sentido creo yo tener en una clase Estudiante un metodo getsueldo que solo este metodo es de los profesores.

Saludos

Última edición por ecfisa fecha: 16-02-2011 a las 20:32:51. Razón: ETIQUETAS DELPHI
Responder Con Cita
  #9  
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
creo yo tener en una clase Estudiante un metodo getsueldo que solo este metodo es de los profesores.
Y tienes razón. Pero tampoco tiene mucho sentido estar procesando una lista genérica si vas a terminar distinguiendo una u otra subclase No es esta la filosofía OOP.

// 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 08:56:03.


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