2010-01-19 9 views
11

Siempre me he preguntado un poco sobre esto, pero ¿por qué la sobrecarga del operador no está disponible para las clases en Delphi?¿Por qué la sobrecarga del operador no está disponible para las clases en Delphi?

Recuerdo haber leído una respuesta mientras huía, y decía que entraría en conflicto con algo, pero no recuerdo mucho. Por lo que puedo decir, solo el operador implícito puede causar un poco de problemas ya que las clases se almacenan en el montón y la asignación es en realidad una copia de la dirección del montón (básicamente copiar punteros).

+1

Funciona en Delphi.NET porque .NET hace la recolección de basura. Esto podría resolverse en el Delphi nativo de dos maneras: 1. si los operadores tienen acceso a las interfaces, y las clases que implementan ese operador heredarán de TInterfacedObject. 2. si las clases administradas se agregaron al lenguaje Delphi. En este momento, Mason tiene razón: tendrías pérdidas de memoria por todos lados. Véase también mi charla a la que se hace referencia en este enlace: http://wiert.wordpress.com/2009/10/19/delphi-operator-overloading-table-of-operators-names-and-some-notes-on-usage-and -glitches/ –

+0

Sí, veo por qué esto podría considerarse un problema, y ​​esto es exactamente lo que he leído en ese artículo, ahora que lo recuerdo. Sin embargo, como dije en mi comentario a la respuesta de Mason, no creo que esto sea realmente una limitación, ya que creo que puedes hacerlo si implementas solo un poco de recolección de basura (que no tendrá ningún efecto secundario). – Cloud737

+0

Si las interfaces tuvieran operadores, surgirían muchos problemas, como por ejemplo no poder cancelar algunos operadores. Por ejemplo, imagina tener un operador implícito en una interfaz y luego tener un objeto que sí necesita la interfaz, pero no necesariamente el operador implícito. Cuando intentas una tarea, todo el infierno puede desatarse, y sería difícil encontrar tu problema. La cosa es que los operadores nunca deben heredarse, si quieres usar la versión "heredada", debes sobrecargarla nuevamente y luego encasillarla. Pero eso significa que las clases también deben tenerlo. – Cloud737

Respuesta

9

Cerrar. Es porque los objetos son tipos de referencia y la memoria se gestiona manualmente. Entonces, si dijiste myResult := myObject1 + myObject2 + myObject3;, tendrías que crear un objeto intermedio en algún lugar allí, y no hay código para liberarlo, por lo que obtienes fugas de memoria.

+1

Los compiladores pueden agregue el código para administrar cadenas, entonces, ¿por qué no puede manejar el objeto oculto? No creo que esta sea la razón. – mj2008

+0

@ mj2008: Por un lado, las cadenas no tienen, y no pueden, constructores personalizados.Los objetos intermedios en este caso bien podrían ser inválidos si no se crean instancias con un constructor apropiado con los parámetros apropiados que la compilación no siempre puede/puede determinar. Las limitaciones que tendrían que imponerse a las clases para soportar la sobrecarga del operador serían sospechas que superan el beneficio. Y como ahora puede tener "registros con métodos", puede usar la sobrecarga del operador junto con esos si lo desea. – Deltics

+0

Veo por qué a primera vista no funcionaría. Sin embargo, ¿no podría el compilador destruir automáticamente los objetos intermediarios, excepto el último en este caso, y luego tratar la asignación como normal? Por ejemplo, primero crea myIntermediaryObject1 como resultado de (myObject1 + myObject2), luego agrégalo a myObject3 creando myIntermediaryObject2, destruyendo automáticamente myIntermediaryObject1 y haciendo la tarea como siempre. Después de todo, la responsabilidad del programador es cuidar la desasignación de myResult si es necesario, y el compilador puede encargarse del resto de los objetos temporales. – Cloud737

0

Mason Wheeler dice que es imposible porque la gestión de objetos intermedios.

Pero de acuerdo a la documentación de Embarcadero, operadores de clase siempre que sea posible con Delphi 2009.

RAD Studio 2009 - Operator Overloading New Delphi language features since Delphi 7

+0

Sobrecarga del operador son para registros. Los registros son tipos de valores mientras que las clases son tipos de referencia. La documentación en sus enlaces está equivocada (aunque afirman que esta característica es para registros, pero falla al usar clases en ejemplos). Ver ['XE3 Operator Overloading'] (http://docwiki.embarcadero.com/RADStudio/XE3/en/Operator_Overloading_ (Delphi)). –

+0

Solo está permitido en registros, no en clases. Pero ahora con XE, los registros pueden tener métodos y propiedades. Entonces ... – PSyLoCKe

+1

@ Todos Los documentos son como son porque el compilador de .net soporta una sobrecarga de operación sobre las clases. Posible debido a GC. –

Cuestiones relacionadas