Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-10-2003
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
¿Qué son los métodos virtuales y los métodos de clase?

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.

Responder Con Cita
  #2  
Antiguo 24-10-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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:

Código:
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
Responder Con Cita
  #3  
Antiguo 25-07-2019
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Gracias, Román.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 26-07-2019
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto

Muy buena explicación Román. Clara y concisa.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 27-07-2019
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Muy buena explicación, Román.

Un abrazo intemporal.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Métodos sobrecargados vs métodos repetidos AgustinOrtu Debates 12 22-10-2016 18:49:53
redefinir métodos virtuales waremovil C++ Builder 1 24-11-2011 23:07:40
Necesito llamar a métodos de clases "hija" desde su clase "padre" Flecha OOP 17 20-04-2007 00:03:53
mostrar metodos de una clase coulthard Varios 7 28-07-2005 17:21:41
Métodos de clase. jplj OOP 14 22-11-2004 09:30:19


La franja horaria es GMT +2. Ahora son las 17:09:04.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi