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