Hay dos tipos de métodos; estáticos y virtuales. Por defecto son estáticos y la directiva
virtual es para declararlos virtuales.
Los métodos virtuales son aquellos que pueden redefinirse en clases descendientes. Por ejemplo:
Código:
type
TPersona = class
procedure Saluda; virtual; {Gggghhhjjjf}
end;
TEspañol = class(TPersona)
procedure Saluda; override; {Hola}
end;
TIngles = class(TPersona)
procedure Saluda; override; {'Hello'}
end;
TFrances = class
procedure Saluda; override; {'Bonjour'}
end;
La clase TPersona define el método "Saluda" y las clases descendientes lo redefinen.
Observa que la directiva
override se utiliza para indicar que vas a redefinir el método.
Básicamente los métodos virtuales se utilizan cuando trabajmos
polimorficamente. Esto quiere decir que podemos definir un objeto de la clase TPersona:
Código:
var
Persona: TPersona;
pero construirlo como algún descendiente en particular:
Código:
Persona := TEspañol.Create;
Persona := TIngles.Create;
Persona := TFrances.Create;
Normalmente, cuando el compilador ve una sentencia como:
no tiene forma de saber de qué clase específica es el objeto Persona, es decir, no sabe si es español, inglés o francés.
Pero sí sabe que Saluda es un método virtual de manera que en lugar de compilar directamente Persona.Saluda al método de la clase base TPersona, pone una referencia a lo que se llama la tabla virtual de métodos.
En tiempo de ejecución, esta referencia se resuelve pues al crear el objeto se sabe a qué clase específica se refiere (TEspañol, TInglés o TFrancés), de manera que el código que finalmente se ejecuta es el correspondiente al tipo de persona en particular.
Si en las declaraciones de las clases de arriba quitases la directiva
virtual (y por tanto las directivas
override) entonces el compilador, al momento de ver Persona.Saluda, adjudicaría directamente el código de la clase base de manera que aún cuando instancies:
Persona := TFrances.Create
en lugar de decir 'Bonjour' dirá 'Gggghhhjjjf'.
---------------------------------------
En cuanto a la otra pregunta, los
métodos de clase, funciones o procedimientos antecedidos por la directiva
class son métodos que pertenecen a la clase en sí (el tipo de datos) y no a ningun objeto en particular de dicha clase. Esto significa que puedes usar estos métodos aún cuando no construyas ningún objeto de dicha clase, simplemente referenciándoos así:
TMiClase.Metodo
Claro está que, al no ertenecer a ningún objeto en particular, este tipo de métodos tienen limitaciones. Por ejemplo no pueden hacer referencia a ningúna propiedad de los objetos ya que la memoria requerida para tal propiedad no ha sido asignada.
El ejemplo más común de este tipo de métodos (aunque por ser un caso especial no se declaran así) es el de los constructores.
Cuando instancias un objeto:
MiObjeto := TMiClase.Create
observa que Create se antepone de
la clase y no de un objeto en particular.
---------------------------------------
Por último, te recomiendo no juntar dos preguntas ennun sólo tema.
// Saludos