2009-09-29 1 views

ответ

5

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

+2

Возможно, это поможет вам понять почему: Статические классы часто используются для инкапсуляции способами, подобными единицам в Delphi. –

+2

Я бы предпочел не предполагать. Можете ли вы, пожалуйста, четко указать, что * вы * подразумеваете под * статическим *? –

4

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

TSomeClass.SomeMethod; 

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

2

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

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

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

1

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

1

Вы можете создать класс, который содержит только статические методы. Если вам нужно поддерживать какое-то состояние, переменные состояния должны передаваться как параметры 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. 
-1

(Да, я знаю эту тему старый, но думал, что я опубликую это для потомков.)

Было указано, что функции класса и процедуры класса реализуют статические методы. Но я добавлю, что следующее заметное поведение статического класса (против класса 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. 
+2

Тот факт, что вам нужно включить подсказки, должен сказать вам, что это плохой код. –

+0

Он просит использовать функцию, которая не поддерживается, поэтому никакое решение не будет идеальным. Что касается подсказок, я бы, как правило, соглашался и не потворствовал отключению подсказок. Обычно намеки правильны и указывают на ошибки, которые могут быть серьезными и неуловимыми. Но присмотритесь к этому делу. 1 - Код не дает никакого намека на Delphi 7. Так ли это плохой код в Delphi 2010, но не в Delphi 7? Ну, может быть. 2- Предупреждение «объявлено, но никогда не используется». Если вы измените приватную защиту и запечатаете класс в 2010 году, .Create все еще скрыт, но подсказка исчезнет. Это делает его лучше? ... –

+0

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

5

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

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

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

8

Похоже пользовательского поиска для «класса функций»:

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

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

TSomeClass.MyFunction(...); 
Смежные вопросы