PDA

Ver la Versión Completa : ¿Qué son los métodos virtuales y los métodos de clase?


David
24-10-2003, 22:26:50
Hola

Cuando en un procedure se ponde al final la palabra virtual ,pues para que es.

Y luego que es una class function , para que sirve y cual es su utilidad.

:confused:

roman
24-10-2003, 22:58:31
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:


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:


var
Persona: TPersona;


pero construirlo como algún descendiente en particular:


Persona := TEspañol.Create;
Persona := TIngles.Create;
Persona := TFrances.Create;


Normalmente, cuando el compilador ve una sentencia como:


Persona.Saluda;


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

dec
25-07-2019, 16:37:16
Hola a todos,

Gracias, Román. :)

Neftali [Germán.Estévez]
26-07-2019, 12:16:44
^\||/^\||/^\||/
Muy buena explicación Román. Clara y concisa.

Al González
27-07-2019, 23:04:30
Muy buena explicación, Román.

Un abrazo intemporal. ;)