Возможно ли в Delphi (Win32) объявить целый класс (а не только функцию класса) статичным?Статические классы в Delphi (Win32)
ответ
Я предполагаю, что вы имеете в виду статические классы, как в .net (а не «статические», как в традиционном Delphi/Native), и ответ на это нет.
Возможно, это поможет вам понять почему: Статические классы часто используются для инкапсуляции способами, подобными единицам в Delphi. –
Я бы предпочел не предполагать. Можете ли вы, пожалуйста, четко указать, что * вы * подразумеваете под * статическим *? –
Я не совсем уверен, что вы подразумеваете под «статическим классом». Вы можете объявить класс, который имеет только методы класса, поэтому эти методы можно вызвать без создания экземпляра класса.
TSomeClass.SomeMethod;
Это то, что вы хотите?
Не изначально.
В зависимости от того, для чего это необходимо, если для целей вашего кода в некоторых случаях вы можете заменить его на Singleton Образец объекта.
Для осуществления этого я бы рекомендовал this guide, который охватывает практически любую версию delphi, но если вы используете Delphi 2010, вы также можете использовать новый class Constructors/Destructors для улучшения результатов.
Вы также можете создать новый модуль под названием 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.
(Да, я знаю эту тему старый, но думал, что я опубликую это для потомков.)
Было указано, что функции класса и процедуры класса реализуют статические методы. Но я добавлю, что следующее заметное поведение статического класса (против класса Delphi) заключается в том, что статический класс не может быть создан.
Классы Delphi получают общедоступный конструктор по умолчанию (без параметров), если вы его не укажете, поэтому можно создать экземпляр любого класса. Если вы объявляете один или несколько конструкторов явно, этот конструктор не предоставляется.
Вы можете удалить все конструкторы, объявив конструктор в частной или защищенной секции вашего класса. Это удаляет ваш конструктор из сферы действия потребителя. Теперь существует только один конструктор, он не отображается и класс не может быть создан.
Пример:
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;
Если у вас есть один из новых версий Delphi, вы можете также рассмотреть герметизацию класса только, чтобы быть немного более правильными. Класс потомков COULD создается, если ваш конструктор защищен, а не частный.
Редактировать
Вот альтернатива, вдохновленный Кеном, для более новых версий Delphi (которые поддерживают запечатанные классы), не влечет за собой компилятор подсказки. Это еще не идеальное решение, но вот оно.
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.
Тот факт, что вам нужно включить подсказки, должен сказать вам, что это плохой код. –
Он просит использовать функцию, которая не поддерживается, поэтому никакое решение не будет идеальным. Что касается подсказок, я бы, как правило, соглашался и не потворствовал отключению подсказок. Обычно намеки правильны и указывают на ошибки, которые могут быть серьезными и неуловимыми. Но присмотритесь к этому делу. 1 - Код не дает никакого намека на Delphi 7. Так ли это плохой код в Delphi 2010, но не в Delphi 7? Ну, может быть. 2- Предупреждение «объявлено, но никогда не используется». Если вы измените приватную защиту и запечатаете класс в 2010 году, .Create все еще скрыт, но подсказка исчезнет. Это делает его лучше? ... –
... Я, как правило, не думаю. Но позвольте мне быть ясными; Я не думаю, что вы ошибаетесь, просто этот конкретный случай - это возможное исключение, и я думаю, что это меньшее количество зол, например, бросание исключения в публичный конструктор для предотвращения создания экземпляра. В любом случае, даже этот, ваша точка действительна, и я не хочу препятствовать тому, чтобы кто-либо ее рассматривал. –
Я хотел бы использовать абстрактный класс (не следует путать с абстрактным методом в классе), чтобы предотвратить его экземпляр вместо понижения в конструктор защищен:
TMyClass = class abstract
public
class procedure DoStuff; static;
end;
Это будет обеспечивать одноэлементный шаблон и предотвратить любой период создания экземпляров.
Похоже пользовательского поиска для «класса функций»:
type
TSomeClass = class
class procedure MyFunction(...);
Это как статический метод, поэтому, назовем его:
TSomeClass.MyFunction(...);
- 1. Статические классы в PHP
- 2. Статические классы в Python
- 3. Статические классы в сервлете
- 4. Делает ли Delphi действительно динамические классы лучше, чем статические?
- 5. Статические классы и заключительные классы в java
- 6. Delphi Win32 и JAVA?
- 7. Вложение Mono в Delphi Win32
- 8. Активатор и статические классы
- 9. Статические классы ... это нормально?
- 10. Статические классы и безопасность
- 11. Статические классы UnitTesting
- 12. Статические классы и эффективность
- 13. Почему используются статические классы?
- 14. Фрагменты как статические классы
- 15. Статические/финальные классы java?
- 16. Статические функции/Классы .. Причины?
- 17. Взаимные справочные записи в Delphi (Win32)
- 18. C++ классы и статические
- 19. Статические классы с C++
- 20. инстанцировании статические вложенные классы
- 21. Когда начинать статические классы?
- 22. Статические классы с iPhone
- 23. Абстрактные статические классы Java
- 24. Статические методы Java + классы
- 25. Почему статические классы закрыты?
- 26. Статические вложенные классы
- 27. Как абстрагировать статические классы
- 28. Статические классы в объекте буквальные
- 29. Статические классы в веб-приложениях
- 30. Реорганизовать классы в статические библиотеки
вручную делают каждую переменную, объект и метод статический (Класс var). вот все – VibeeshanRC