¿Cuál es el equivalente de Delphi de 'esto' en C++? ¿Podría darnos algunos ejemplos de su uso?Referencia de instancia en Delphi?
Respuesta
En la mayoría de los casos, no debe usar self
en los métodos.
De hecho, es como si hubiera una implícita self.
prefijo cuando accede a las propiedades y métodos de clase, dentro de un método de la clase:
type
TMyClass = class
public
Value: string;
procedure MyMethod;
procedure AddToList(List: TStrings);
end;
procedure TMyClass.MyMethod;
begin
Value := 'abc';
assert(self.Value='abc'); // same as assert(Value=10)
end;
El self
se va a utilizar cuando se quiere especificar el actual objetar a otro método u objeto.
Por ejemplo:
procedure TMyClass.AddToList(List: TStrings);
var i: integer;
begin
List.AddObject(Value,self);
// check that the List[] only was populated via this method and this object
for i := 0 to List.Count-1 do
begin
assert(List[i]=Value);
assert(List.Objects[i]=self);
end;
end;
el código anterior se añade un elemento a la lista de TStrings
, con List.Objects [] apuntando a la instancia TMyClass. Y comprobará que este ha sido el caso para todos los artículos de la Lista.
En delphi Self es el equivalente a esto. También es asignable como se describe en here.
Tenga en cuenta que, dado que se pasa por valor, la asignación a sí mismo no es muy útil, aunque puede hacerse. No será, como algunos podrían esperar, "devolver" nada de un constructor (los constructores en realidad no "devuelven" nada, la sintaxis de asignación es solo una conveniencia). –
Hmmm ... Veo que las personas en la pregunta de SO vinculadas por usted dicen lo mismo. –
Asignar a uno mismo es un caso de esquina y normalmente no tendrías que hacer esto, ya que podría considerarse como una mala práctica. Sin embargo, utilizar Self como referencia de una clase es útil solo si se utilizan convenciones de nomenclatura no estándar. Las convenciones estándar serían el uso de F como un prefijo de variables de clase (FIsCorrect como ejemplo) y A como argumentos de procedimiento/función (AIsCorrect). Entonces, la asignación de variables de clase sería tan simple como FIsCorrect: = AIsCorrect, alternativamente, necesitaría usar Self.IsCorrect: = IsCorrect if function (procedure) argument is: IsCorrect: Boolean. – too
- 1. Instancia de objeto de referencia creada con "con" en Delphi
- 2. ¿Instancia actual de RoleProvider de referencia?
- 3. ¿Los campos de instancia/clase deben estar prefijados en Delphi?
- 4. cómo pasar la referencia de la instancia actual en C#
- 5. En referencia a la instancia en has_many (Rails)
- 6. Sincronización en la "referencia" o en la instancia
- 7. ¿Cómo se pasa una matriz por referencia en Delphi?
- 8. Objective-C: Creación de Instancia de la clase de referencia
- 9. Hacer referencia a variables de instancia de AppDelegate
- 10. Delphi paso de parámetros por referencia o por valor/copia
- 11. objeto hace referencia a una instancia transitoria no guardado: guardar la instancia transitoria antes de enjuagar
- 12. ¿Es una referencia nula una instancia de una clase?
- 13. AV extraño cuando se almacena una referencia Delphi interfaz
- 14. LINQ: la expresión Where devuelve una nueva instancia o referencia a la instancia del objeto
- 15. Griales Gorm: Objeto referencia a una instancia transitoria no salvo
- 16. "Fundamentos de Delphi" en Delphi 2009
- 17. Método de instancia de llamada en una referencia nula en IL
- 18. ¿Cómo crear una instancia de objeto con RTTI en Delphi 2010?
- 19. Constantes de clase/estáticas en Delphi
- 20. Usando una referencia de tipo de clase específica en el atributo-constructor Delphi
- 21. ¿Cómo obtener la referencia de tipo de clase por su nombre en Delphi XE?
- 22. ¿Cómo hago referencia a la instancia de GroovyObject desde los métodos de MetaClass en Groovy?
- 23. ASP.NET MVC - Html.Textbox() arroja "Referencia de objeto no establecida en una instancia de un objeto"
- 24. MVC Error: Referencia de objeto no establecida en una instancia de un objeto
- 25. MVC3 - Insertar usando ViewModel - Referencia de objeto no establecida en una instancia de un objeto
- 26. ¿Por qué no son iguales los métodos de instancia enlazados en la referencia de Python?
- 27. ¿Hay una forma correcta de devolver una nueva instancia de objeto por referencia en C++?
- 28. PHP SOAP Problema: Referencia de objeto no establecida en una instancia de un objeto
- 29. Referencia de objeto no establecida en una instancia de un objeto.
- 30. C# sessions "Referencia de objeto no establecida en una instancia de un objeto".
@AB - "auto implícito" - desde que empecé a jugar con Python, que requiere 'auto' al hacer referencia a cualquier miembro de la clase interna, también he empezado a hacerlo en Delphi - no estoy seguro si me gusta o no estilísticamente, pero parece facilitar un escaneo más rápido del código. – Vector
@Mikey La práctica común en Delphi es no usar el prefijo 'self'. De hecho, IDE intellisense le permite acceder rápidamente a los nombres de las propiedades, o ver la declaración con la sugerencia emergente del mouse o Ctrl + clic, por lo que no es necesario especificar este prefijo.Si no define variables globales en su código (esto es necesario para un buen código), usted sabe que los identificadores en su código de métodos son nombres de propiedad/método. Por lo tanto, no debe usar el prefijo 'self.' En sus métodos (a menos que esté dentro de una declaración 'with'). –
@AB - Sé y estoy de acuerdo con todo lo que dijo, pero eso no niega mi razón para usarlo. Si desea escanear/leer rápidamente un fragmento de código, 'auto' ayuda: a menudo me gusta recostarme y simplemente leer el código sin ningún mouse ni interacción, y también me gusta imprimir el código y simplemente leerlo. Entonces es el enfoque de "autoayuda" ... LOL – Vector