Porque SELF no es una variable, sino una constante. Siempre es la referencia (puntero) al objeto del método que se está ejecutando en ese momento.
Cuando defines un método de una clase, como por ejemplo:
Código Delphi
[-]
TMiClase = CLASS
PUBLIC
PROCEDURE Metodo (aVariable: STRING);
END;
en realidad el compilador lo interpreta como si fuera así:
Código Delphi
[-]
TMiClase = CLASS
PUBLIC
PROCEDURE Metodo (CONST Self: TMiOBjeto; aVariable: STRING);
END;
Y cuando llamas al método:
Código Delphi
[-]
MiObjeto.Metodo ('Hola');
El compilador lo interpreta como si fuera así:
Código Delphi
[-]
TMiClase.Metodo (MiObjeto, 'Hola');
El caso de RESULT es diferente, ya que sí es una variable cuya posición de memoria se corresponde con la posición de pila donde el llamante tomará el valor devuelto por la función. En cierto modo, una definición como:
Código Delphi
[-]
FUNCTION UnaFuncion (aValor: INTEGER): INTEGER;
Se interpreta como si fuera:
Código Delphi
[-]
PROCEDURE UnaFuncion ( OUT RESULT: INTEGER; aValor: INTEGER);
y si fuera método de una clase...
Código Delphi
[-]
PROCEDURE UnaFuncion (CONST SELF: TMiClase; OUT RESULT: INTEGER; aValor: INTEGER);