2011-07-22 9 views

Respuesta

3

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.

+0

@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

+0

@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'). –

+0

@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

9

En delphi Self es el equivalente a esto. También es asignable como se describe en here.

+3

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). –

+1

Hmmm ... Veo que las personas en la pregunta de SO vinculadas por usted dicen lo mismo. –

+0

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

Cuestiones relacionadas