Métodos de clase
Los métodos de clase son igual que los métodos de siempre. Lo que los diferencia de los "comunes" es que éstos se declaran anteponiendo la palabra "Class":
delphi
class function NombreMetodo(ListaParametros): Tipo; class procedure NombreMetodo(ListaParametros); ... class function NombreMetodo(ListaParametros): Tipo; begin ... end; class procedure NombreMetodo(ListaParametros); begin .... end;
Como dije al comienzo: el método sirve para trabajar con la clase y como el método "apunta" a la clase (mediante el parámetro implícito self) y no a la instancia, no se puede emplear éstos métodos para acceder a propiedades, atributos, etc.
¿Entonces de que sirve tenerlos?
En realidad sirven para dar funcionalidad a nivel de clase, y no de una instancia. Es decir que los métodos son aplicados en un concepto mucho más abstracto.
Funcionan independientemente de si hay o no una clase, por ello es que se puede hacer cosas como éstas:
delphi
var Clase: TMiClase; ... TMiClase.MetodoClase; // Se usa a la clase Clase.MetodoClase; // se invoca al método a través de una instancia
Contar con métodos de clase nos permite trabajar fuera del contexto de una instancia y aplicar operaciones más generales (recuerde que una instancia es un caso particular, o concreto de una clase). Por ejemplo: ¿es necesario contar con un objeto para saber la cantidad que han sido creados? No necesariamente. Puede emplearse una variable privada u oculta que lleve el conteo de instancias a medida que se crean y liberan los objetos y emplear un método de clase para consultar su valor.
De modo similar, ¿es necesario contar con instancias si lo que deseamos saber es si una clase pertenece a una jerarquía u otra, o si cuenta con alguna funcionalidad?
No. Porque lo que define a éstas acciones no es a una instancia, sino al conjunto de éstas instancias: la clase.
Cualquier dato, funcionalidad, y/o comportamiento que desee conocer sobre una clase puede ser consultado, y aplicado mediante métodos de clase.
Existen muchos de hecho TObject ofrece los más básicos:
delphi
class function InitInstance(Instance: Pointer): TObject; function ClassType: TClass; class function ClassName: ShortString; class function ClassNameIs(const Name: string): Boolean; class function ClassParent: TClass; class function ClassInfo: Pointer; class function InstanceSize: Longint; class function InheritsFrom(AClass: TClass): Boolean; class function MethodAddress(const Name: ShortString): Pointer; class function MethodName(Address: Pointer): ShortString; class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry; class function GetInterfaceTable: PInterfaceTable; class function NewInstance: TObject; virtual;
Eso si, más comunes son las funciones que los procedimientos. Lo importante del concepto es que cualquier operatoria que el negocio o contexto nos indique que se aplica a un nivel conceptual puede ser enfocado mediante esta técnica.
A los métodos de clase le son aplicables todos los conceptos a cualquier método: sobrecargarlos, sobreescribirlos, etc.
En el próximo post dejo un ejemplo muy sencillo de uso.