Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Moldeado de tipos (https://www.clubdelphi.com/foros/showthread.php?t=13063)

walrus 05-08-2004 12:05:18

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.

marto 05-08-2004 12:13:54

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.

walrus 05-08-2004 16:32:02

Me ha quedado perfectamente claro. Gracias.

Al González 06-08-2004 03:10:35

¡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 :).


La franja horaria es GMT +2. Ahora son las 04:16:18.

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