Статические классы в Delphi (Win32)

возможно ли в Delphi (Win32) объявить весь класс (а не только функцию класса) статическим?

8 ответов


Я предполагаю, что вы имеете в виду статические классы, такие как в .net (а не "статические", как в традиционных Delphi/Native) - и ответ на это нет.


похоже на поиск пользователем "функций класса":

type
TSomeClass = class
class procedure MyFunction(...);

это статический метод, поэтому, назовем это:

TSomeClass.MyFunction(...);

Я бы использовал абстрактный класс (не путать с абстрактным методом в классе), чтобы предотвратить его создание вместо понижения конструктора до защищенного:

TMyClass = class abstract
public
  class procedure DoStuff; static;
end;

это будет применять шаблон singleton и предотвратить любой период создания экземпляров.


Я не совсем уверен, что вы подразумеваете под "статический класс". Вы можете объявить класс, который имеет только методы класса, поэтому эти методы можно вызвать без создания экземпляра класса.

TSomeClass.SomeMethod;

Это то, что вы хотите?


изначально не.

в зависимости от того, для чего он вам нужен, если для целей вашего кода в некоторых случаях вы можете заменить его на Синглтон объект шаблон.

для пошагового руководства по реализации этого я бы рекомендовал данное руководство который охватывает практически любую версию delphi, но если вы используете Delphi 2010, вы также можете использовать новый класса конструкторы/деструкторы для улучшения результатов.


вы также можете создать новый блок под названием uDG_Utils, например, определить класс, определить глобальную переменную для этого класса, и в разделе инициализация и завершение вы управляете конструктором и деструктором класса. Теперь все, что вам нужно сделать, это назвать его как mySuperDuperClass.SuperMethod...


вы можете создать класс, который содержит только статические методы. Если вам нужно поддерживать какое-то состояние, переменные состояния должны передаваться как параметры var. Нет никакого способа "правильно" получить доступ к статическим переменным, кроме как иметь набор глобальных переменных в разделе реализации класса вне области действия класса, например:

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.


изменить Я отредактировал этот пост, чтобы удалить его. Ответ, по общему признанию, плохой и заслуживает пониженных голосов. Я не хочу оставаться здесь, чтобы запутать или ввести в заблуждение кого-либо еще.