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 05-08-2004
walrus walrus is offline
Miembro
 
Registrado: ago 2004
Posts: 40
Poder: 0
walrus Va por buen camino
Moldeado de tipos

Hola, quisiera saber la diferencia entre hacer lo siguiente:

Código Delphi [-]
TClase(Obj).HacerAlgo

y

Código Delphi [-]
(Obj as TClase).HacerAlgo

¿Cuando se emplea uno y cuando el otro? ¿Son realmente equivalentes o hay diferencias? ¿Qué es más eficiente?

Gracias.
Responder Con Cita
  #2  
Antiguo 05-08-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 21
marto Va por buen camino
Wop!

De la primera, Delphi va a la dirección de memoria de la referencia, da por supuesto que es de la clase que le indicas e intenta acceder a la dirección del método o la propiedad en cuestión. Si la referencia no es de ese tipo, saltará un Access Violation.

De la segunda manera, Delphi comprueba (en ejecución, claro) que la referencia sea de la clase "prometida" o de un descendiente. Si no lo es la excepción es un poco más elegante: te dirá que no puede hacer el cast.

El primer sistema es más más rápido, así que, como normalmente no querrás que salga ninguna excepción, lo típico es el siguiete patrón:
Código Delphi [-]
  if Refencia is Clase then
    Clase(Referencia).LoQueSea
  else
    LoQueTeParezca;

No obstante, existen algunas circunstancias en las que no podrás hacer el cast directo (sin el "as"), por ejemplo si trabajas con variables de clase.
__________________
E pur si muove
Responder Con Cita
  #3  
Antiguo 05-08-2004
walrus walrus is offline
Miembro
 
Registrado: ago 2004
Posts: 40
Poder: 0
walrus Va por buen camino
Me ha quedado perfectamente claro. Gracias.
Responder Con Cita
  #4  
Antiguo 06-08-2004
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Buen día a todos!


Cita:
Empezado por marto
...De la primera, Delphi va a la dirección de memoria de la referencia, da por supuesto que es de la clase que le indicas e intenta acceder a la dirección del método o la propiedad en cuestión. Si la referencia no es de ese tipo, saltará un Access Violation...
Con respecto a lo anterior debo decir que no necesariamente se elevará una excepción, y no necesariamente de tipo Access Violation, aunque regularmente puede darse el caso. Esto es porque el acceso a un miembro del objeto puede resultar en un acceso válido de memoria, aunque no sea un acceso válido de estructura. Depende de la estructura de cada clase y de qué realice la propiedad o método que está siendo referenciado.

A final de cuentas, sólo aconsejo (y utilizo) el molde de tipo Clase (Objeto) cuando estoy seguro de que la referencia será siempre válida. Esto sucede por ejemplo cuando hacemos referencia a un elemento de la propiedad Components de una forma, y sabemos que dicho componente es un TEdit:

Código:
TEdit (Components [4]).Text := 'Prueba';
Espero esto sea de utilidad. Seguimos en contacto.

Al González .
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 20:24:21.


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