¿Es posible en Delphi (Win32) declarar una clase completa (no solo una función de la clase) como estática?Clases estáticas en Delphi (Win32)
Respuesta
Supongo que quiere decir clases estáticas como en .NET (y no "estático" como en Delphi/Native tradicional) - y la respuesta es no.
Quizás esto lo ayude a comprender por qué: las clases estáticas se usan a menudo para encapsular de forma similar a las unidades en Delphi. –
Prefiero no asumirlo. ¿Podrías por favor decir claramente qué * * quieres decir con * estático *? –
No estoy muy seguro de lo que quiere decir con una "clase estática". Puede declarar una clase que solo tenga métodos de clase, de modo que estos métodos se puedan invocar sin crear una instancia de la clase.
TSomeClass.SomeMethod;
¿Eso es lo que quieres?
No nativo.
Dependiendo de lo que lo necesite, si para los fines de su código, en algunos casos de uso podría reemplazarlo con un objeto Singleton Pattern.
Para obtener información acerca de cómo implementar esto, recomiendo this guide, que cubre casi cualquier versión de Delphi, pero si usa Delphi 2010 también puede usar el nuevo class Constructors/Destructors para obtener mejores resultados.
También puede crear una nueva unidad llamada uDG_Utils, por ejemplo, definir una clase, definir una variable global para esa clase y en la sección de inicialización y finalización administrar el constructor de la clase y el destructor. Ahora todo lo que necesita hacer es llamarlo como mySuperDuperClass.SuperMethod ...
Puede crear una clase que contenga nada más que métodos estáticos. Si tiene que mantener algún tipo de estado, las variables de estado se deben pasar como parámetros var. No hay manera de "adecuada" acceder a las variables estáticas otros de tener un conjunto de variables globales en la sección de implementación de la clase fuera del ámbito de la clase, por ejemplo:
UNIT TestUnit;
INTERFACE
Type
TStaticClass = Class
public
procedure Foo(var Bar:String); static;
end;
IMPLEMENTATION
var
LastBar : String; // the last bar
LastRes : string; // the last result
Procedure TStaticClass.Foo(var Bar:String);
begin
if Bar <> LastBar then
LastRes := SomeCPUExpensiveProcess(Bar);
LastBar := Bar;
Bar := LastRes;
end;
INITIALIZATION
LastBar := '';
LastRes := SomeCPUExpensiveProcess('');
END.
(Sí, sé que este hilo es viejo, pero pensé en publicarlo para la posteridad.)
Se ha señalado que las funciones de clase y los procedimientos de clase implementan métodos estáticos. Pero agregaré que el siguiente comportamiento notable de una clase estática (frente a una clase Delphi) es que no se puede crear una instancia de una clase estática.
Las clases Delphi obtienen un constructor predeterminado público (sin parámetros) si no especifica uno, por lo que se puede crear una instancia de cualquier clase. Si declara uno o más constructores explícitamente, este constructor no se proporciona.
Puede eliminar todos los constructores declarando un constructor en la sección privada o protegida de su clase. Esto elimina su constructor del alcance del consumidor. Ahora solo hay un constructor, no es visible y no se puede crear una instancia de la clase.
Ejemplo:
type
TMyStaticClass = class(TObject)
private
// Hide the default constructor, suppressing hint H2219.
{$HINTS OFF} constructor Create; {$HINTS ON}
public
class procedure Method1; // A static method
end;
implementation
constructor TMyStaticClass.Create;
begin
// Do nothing. This cannot be called.
end;
class procedure TMyStaticClass.Method1();
begin
// Do something here.
end;
Si usted tiene una de las nuevas versiones de Delphi, se puede considerar también el sellado de la clase sólo para ser un poco más adecuada. Las clases descendientes PODRÍAN crearse instancias si su constructor está protegido en lugar de privado.
Editar
Aquí es una alternativa, inspirado por Ken, para las nuevas versiones de Delphi (que permite usar clases selladas), que no incurre en una pista compilador. Todavía no es una solución perfecta, pero aquí está.
unit Unit1;
interface
type
TMyStaticClass = class sealed (TObject)
protected
constructor Create;
public
class procedure Method1; // A static method
end;
implementation
constructor TMyStaticClass.Create;
begin
// Do nothing. This cannot be called.
end;
class procedure TMyStaticClass.Method1();
begin
// Do something here.
end;
end.
El hecho de que tenga que desactivar las sugerencias debería indicarle que este es un código deficiente. –
Está solicitando una característica que no es compatible, por lo que ninguna solución será perfecta. En cuanto a las sugerencias, normalmente estoy de acuerdo y no tolero desactivar las sugerencias. Los consejos suelen ser correctos y señalan errores que pueden ser serios y elusivos. Pero mira más de cerca en este caso. 1- El código no produce ninguna pista en Delphi 7. Entonces, ¿es un código deficiente en Delphi 2010 pero no en Delphi 7? Bien quizás. 2- La advertencia es "declarada pero nunca utilizada". Si cambia el privado a protegido y sella la clase en 2010, .Create todavía está oculto, pero la pista desaparece. ¿Eso lo hace mejor? ... –
... tiendo a pensar que no. Pero déjame ser claro; No creo que estés equivocado, solo que este caso particular es una posible excepción y que creo que es el menor de muchos males, como lanzar una excepción en un constructor público para evitar la creación de instancias. En cualquier caso, incluso este, su punto es válido y no quiero disuadir a nadie de considerarlo. –
me gustaría utilizar una clase abstracta (que no debe confundirse con un método abstracto en una clase) para evitar que sea una instancia en lugar de degradar el constructor para proteger:
TMyClass = class abstract
public
class procedure DoStuff; static;
end;
Eso hará cumplir el patrón singleton y previene cualquier período de instancias.
Parece que la búsqueda de usuario para "funciones de clase":
type
TSomeClass = class
class procedure MyFunction(...);
Esto es como método estático, por lo que, lo llaman:
TSomeClass.MyFunction(...);
- 1. Propiedades estáticas en clases estáticas
- 2. LINQ en Win32 DELPHI
- 3. @autowired en clases estáticas
- 4. clases estáticas en C#
- 5. Clases estáticas en Python
- 6. Registros de referencias mutuas en Delphi (Win32)
- 7. HttpContext.Current accedido en clases estáticas
- 8. clases internas estáticas en Scala
- 9. Extendiendo clases estáticas PHP
- 10. Activador y clases estáticas
- 11. ¿Cómo declarar variables estáticas en Delphi 2009?
- 12. Constantes de clase/estáticas en Delphi
- 13. Comenzando con SOAP para Delphi en Win32
- 14. clases singleton/estáticas para servicios
- 15. ¿Usos para clases genéricas estáticas?
- 16. Prueba de unidad Clases estáticas
- 17. ¿Debería evitar las clases estáticas?
- 18. ¿Usando __call con clases estáticas?
- 19. Interfaces de biblioteca virtual para Delphi/Win32?
- 20. Pautas para cuando usar clases estáticas sobre clases de instancias?
- 21. ¿Por qué se usan clases estáticas?
- 22. Cuándo usar clases estáticas vs instanciadas
- 23. ¿Está bien terminar utilizando clases principalmente estáticas?
- 24. ¿Dónde almacena CLR las clases estáticas?
- 25. ASP.NET Clases estáticas y sesiones asp.net
- 26. C# MEF uso con clases estáticas
- 27. ¿Por qué Android prefiere las clases estáticas
- 28. clases estáticas deben derivarse de objeto (C#)
- 29. Cargando DLL no inicializando clases C++ estáticas
- 30. ¿Puedo usar clases estáticas para mi registrador?
hacer manualmente cada variable, objeto y método estático (Clase var). eso es todo – VibeeshanRC