tipos reales rangos programacion lenguaje datos borland delphi methods record

reales - Registre métodos y parámetros de const en Delphi



tipos de variables reales (2)

David analizó la restricción bastante bien. Si el compilador revisara tales detalles, realmente podría hacerlo con un poco de penalización. Además, no veo nada malo con el comportamiento del compilador. El método que obtiene el registro no puede alterar directamente sus datos, sino solo cuando usa el método que contiene. El registro en este caso funciona como un objeto: puede, de la misma manera, un objeto que un const y aun así tener el mismo problema que usted describió, es decir. los métodos del objeto se pueden usar para alterar sus datos.

El beneficio del objeto es que dichos métodos pueden declararse privados, lo que le permite proteger sus datos. Incluso podría crear una clase heredada que haga precisamente eso, es decir, ocultando todas las posibilidades de alterar sus datos. ¿Tal vez quieres probar este enfoque?

Parece que el compilador Delphi no cumple los parámetros de registro const cuando se trata de "registros con métodos".

Al no haber intentado abusar de la convención const previamente, me sorprendió un poco descubrir que el compilador aceptaba un código como ese:

type TTest = record Field : String; procedure Update; end; procedure TTest.Update; begin Field := Field + ''+1''; end; procedure DoStuff(const t : TTest); begin ShowMessage(t.Field); t.Update; ShowMessage(t.Field); end;

Mientras que si intentas hacer un t.Field:=''doh''; en DoStuff fi, el compilador se quejará correctamente, pero puede llamar a los métodos que modifican el registro "const" sin siquiera una pista o advertencia. Por lo tanto, este es un comportamiento diferente al de los tipos de referencia (como clases o matrices dinámicas), donde las escrituras directas de campo están permitidas (ya que const solo restringe los cambios al parámetro en sí).

Addendum : esto permite modificar las constantes de tiempo de compilación declaradas de esta manera, como en:

const cTest : TTest = (Field : ''1''); ... cTest.Update; // will show ''1'' then ''1''+''1'' ShowMessage(cTest.Field); // will show ''1'' (because optimized at compile-time)

¿Es eso un comportamiento aceptado / documentado? o solo un defecto del compilador?


const nunca pone restricciones a las llamadas a métodos en Delphi, ya sea en registros o instancias de clases. Por lo tanto, no creo que haya algo inconsistente con el tratamiento de las llamadas a métodos.

Si no se pudieran invocar los métodos en el registro pasado como un parámetro const , entonces eso representaría casi inútil registros con métodos. Significaría, por ejemplo, que no se podría llamar a un comprador de propiedades. Para colocar restricciones en tales registros pasados ​​como const , debería haber un concepto equivalente a las funciones miembro de C ++. Eso le permitiría al compilador saber que ciertos métodos no eran mutantes.