2009-05-09 9 views
15

Delphi 2006 introdujo nuevas capacidades para los registros, haciéndolos más 'orientados a objetos'.¿Cuándo debo usar tipos de registros mejorados en Delphi en lugar de clases?

¿En qué situaciones es el tipo de registro más apropiado para un diseño que un tipo de clase? ¿Qué ventaja tiene usar estos tipos de registros?

+0

Puede echar un vistazo a [nuestra envoltura matriz dinámica] (http://blog.synopse.info/post/2011/03/12/TDynArray-and-Record-compare/load/save-using -fast-RTTI), que añaden métodos similares a TList para cualquier matriz dinámica. También es capaz de serializar el contenido de la matriz/registro. También descubrí un error al azar en Delphi 2010 (al menos), sobre objetos: a veces, [los objetos contados de referencia no se inicializaron] (http://blog.synopse.info/post/2011/01/29/record-and -object-issue-in-Delphi-2010)! En este caso, debe usar registros para tales estructuras. –

Respuesta

15

Tiene registros, objetos y clases.

Los registros están disponibles desde turbo pascal 1.Son livianos, capaces de tener propiedades y métodos, pero no admiten la herencia. Hay algunos problemas con las funciones que devuelven registros. Si estos registros tienen métodos esto a veces da errores internos:

type 
    TRec = record 
    function Method1: Integer; 
    end; 

function Func: TRec; 


procedure Test; 
var 
    x : TRec; 

begin 
    Func.Method1; // Sometimes crashes the compiler 
    // Circumvention: 
    x := Func; 
    x.Method1; // Works 
end; 

objetos se introducen con Turbo Pascal 5 si estoy en lo correcto. Luego proporcionaron una forma de OO con Pascal. Están más o menos obsoletos con la introducción de Delphi, pero aún puedes usarlos. Los objetos pueden implementar interfaces.

Las clases se introducen con Delphi 1 y las más versátiles. Implementan interfaces y admiten herencia. Pero cada variable de clase es un puntero oculto. Esto significa que las clases deben crearse en el montón. Por suerte, este proceso está oculto en su mayoría.

A continuación se muestra una tabla con las diferencias entre los tres. Agregué la interfaz para completarla.

    |Class|Object|Record|Interface| 
------------------|-----------------------------| 
Are pointers?  | y | n | n | y | 
Inheritance  | y | y | n | y | 
Helpers   | y | n | y | n | 
Impl. Interface | y | y | n | - | 
Visibility  | y | y | n | n | 
Method   | y | y | y | y | 
Fields   | y | y | y | n | 
Properties  | y | y | y | y | 
Consts   | y | y | y | n | 
Types    | y | y | y | n | 
Variants   | n | n | y | n | 
Virtual   | y | n | y | - | 
------------------|-----------------------------| 
+0

¿Podría decir si los objetos aún están en blanco? apoyado en Delphi? Sé de "procedimiento xx de objeto"; pero no recuerdo haberlos visto en ningún otro lado. –

+0

Sí, los objetos aún se admiten en D2009. No hay ayudantes de objetos, pero los objetos pueden implementar interfaces. –

+1

Y el procedimiento "procedimiento xx de Object" es para declarar firmas de eventos para los métodos, AFAIK no tiene nada que ver con los objetos. –

1

Puede usar operator overloading (como las conversiones implícitas). Esto también puede hacerlo en Delphi 2007+ o 2006.NET en objetos, pero solo en estos registros en 2006 win32.

8

creo que estas características son también disponible en Delphi 8 y 2005.

directriz principal: si usted está en duda, utilice una clase.

Para el resto debe entender la diferencia principal: los objetos de clase siempre se utilizan a través de una referencia y se crean llamando a un constructor.

La gestión de la memoria y la asignación para los registros es la misma que para los tipos básicos (es decir, entero, doble). Eso significa que se pasan a los métodos por valor (a menos que se use var). Además, no necesita registros gratuitos, y esa es la razón por la que admiten la sobrecarga del operador. Pero no hay herencia ni métodos virtuales, etc. Los nuevos Registros pueden tener un constructor pero su uso es algo opcional.

Las principales áreas y los criterios para el uso de registros:

  • cuando se trata de estructuras de la API de Win32

  • cuando los tipos no tienen identidad (debido a la asignación significa copiar)

  • cuando las instancias no son demasiado grandes (la copia de grandes registros se vuelve costosa)

  • w Cuando se construyen tipos de valores, cuyo comportamiento debe imitar a los tipos numéricos. Los ejemplos son DateTime, números complejos, vectores, etc. Y luego la sobrecarga del operador es una buena característica, pero no lo haga el factor decisivo.

y la eficiencia en cuanto, no se exceda este:

  • para los tipos más pequeños que se colocan en hileras a menudo.

Y, por último, las reglas para usar una clase o un registro en realidad no han cambiado desde las versiones anteriores de Delphi.

+0

Están disponibles para la plataforma Delphi.NET, pero no para win32 Delphi hasta 2007. – DiGi

+0

mjustin no era específico sobre qué características, pero las propiedades, los métodos y el público/privado estaban disponibles para D2005/win32 –

6

Además de las otras respuestas (sobrecarga del operador, tipos de valores livianos), es una buena idea hacer los registros de sus enumeradores en lugar de las clases. Ya que están asignados en la pila, no hay necesidad de construirlos y destruirlos, lo que también elimina la necesidad del intento oculto ... por último bloquear el compilador alrededor de los enumeradores de clase.

Consulte http://hallvards.blogspot.com/2007/10/more-fun-with-enumerators.html para obtener más información.

Cuestiones relacionadas