Текущий архив: 2003.06.16;
Скачать: CL | DM;
ВнизОграничение на создание количества экземпляров обьектов. Найти похожие ветки
← →
bkv (2003-06-02 18:01) [0]Здравствйте,
Существует ли какой-нибудь механизм, позволяющий ограничивать количество создаваемых обьектов одного класса?
← →
Skier (2003-06-02 18:05) [1]Конечно. Их подсчёт.
← →
Calm (2003-06-02 18:12) [2]В секции imlementation модуля, в котором объявлен класс объекта нужно сделать глобальную переменную.
В конструкторе класса инкрементировать ее, а в деструкторе - декрементировать.
Если в конструкторе обнаруживается, что значение счетчтика достигло определенного значения, то вызывать исключение. При этом автоматически вызовется десруктор объекта.
← →
Мое имя (2003-06-02 18:28) [3]семафор?
← →
bkv (2003-06-03 10:20) [4]Т.е нет никаких механизмов языка для решения этой задачи кроме подсчета?
← →
vlv (2003-06-03 10:25) [5]В Паскале не предусмотрены переменные класса, только ОБЪЕКТЫ.
Так что лучше всего воспользоваться общими переменными, как советует Calm.
← →
Skier (2003-06-03 10:29) [6]
> В Паскале не предусмотрены переменные класса, только ОБЪЕКТЫ.
То есть ?
← →
iZEN (2003-06-03 11:22) [7]Для Skier © (03.06.03 10:29).
Ну, в Java есть не только методы класса, но и поля:
public class Demo {
//Закрытый конструктор
private Demo() {
super();
}
//Глобальная переменная - счётчик экземпляров (видна из всех экземпляров данного класса)
private static int globalField = 0;
//Фабричный метод
public static Demo init() {
globalField++;
return new Demo();
}
//метод деинициализации (деструкторов в Java нет)
public void destroy() {
globalField--;
}
}
В ObjectPascal только так:
Demo = class
private
constructor Create();//Закрытый конструктор
public
destructor Destroy(); override;
class function Init(): Demo;//Фабричный метод
end;
implementation
var
GlobalField: Integer;//Глобальная переменная - счётчик экземпляров
//Закрытый конструктор
constructor Create();
begin
inherited Create();
end;
//Перегруженный деструктор
destructor Destroy(); override;
begin
Dec(GlobalField);
inherited Destroy();
end;
//Фабричный метод
class function Demo.Init(): Demo;
begin
Inc(GlobalField);
Result := Demo.Create();
end;
← →
Skier (2003-06-03 11:24) [8]>iZEN © (03.06.03 11:22)
> Ну, в Java есть не только методы класса, но и поля:
И что ? У классовв Delphi не может быть полей что ли ?!
← →
iZEN (2003-06-03 11:27) [9]Для Skier © (03.06.03 11:24).
Необходимо различать:
1) поля класса и поля объекта;
2) методы класса и методы объекта.
В Delphi осознано только п.2).
← →
Skier (2003-06-03 11:35) [10]>iZEN © (03.06.03 11:27)
Ааа. Ты в этом смысле...
← →
Sandman25 (2003-06-03 11:42) [11]Skier © (03.06.03 11:24)
В Delphi будет такое поле будет в каждом обьекте.
В Java (и С++) можно сделать поле, которое будет shared между всеми экземплярами класса.
← →
Skier (2003-06-03 11:43) [12]Господа, не наседайте ! Я уже понял что имелось в виду.
← →
Sandman25 (2003-06-03 12:02) [13]Skier © (03.06.03 11:43)
Извините. Я долго писал - Вашего сообщения Skier © (03.06.03 11:35) еще не видел.
← →
VaS (2003-06-03 13:20) [14]Господа, человек под именем "Мое имя" давно назвал самый простой и потокобезопасный способ - семафор.
← →
Reindeer Moss Eater (2003-06-03 14:07) [15]В секции imlementation модуля, в котором объявлен класс объекта нужно сделать глобальную переменную.
В конструкторе класса инкрементировать ее, а в деструкторе - декрементировать.
Если в конструкторе обнаруживается, что значение счетчтика достигло определенного значения, то вызывать исключение. При этом автоматически вызовется десруктор объекта.
Все это поможет ограничить количество объектов, создаваемых в ОДНОМ процессе.
Страницы: 1 вся ветка
Текущий архив: 2003.06.16;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.006 c