Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.22;
Скачать: CL | DM;

Вниз

TSingleton.Create; — компилится   Найти похожие ветки 

 
Kolan ©   (2007-05-16 23:08) [0]

Синглетон:

TSingleton = class
 strict private
   class var FInstance: TSingleton;
   constructor Create;
 strict protected
 public


Пишу:
TSingleton.Create;

Компилится, мне что спать пора?
Почему?


 
Kolan ©   (2007-05-16 23:10) [1]

Ctrl + Click на Create попадаю в конструктор TObject. Что за?


 
{RASkov} ©   (2007-05-16 23:52) [2]

> [1] Kolan ©   (16.05.07 23:10)

конструктор - это классовый метод, он и должен применятся к классу, а не к эзмпляру класса(что впринципе не запрещено). При применении конструктора к экземпляру - просто отработает код конструктора, но память не выделится.

> Компилится, мне что спать пора?

Может быть....;)
ЗЫ я про D7 но, думаю, и в поздних версиях тоже самое...


 
{RASkov} ©   (2007-05-16 23:57) [3]

> Ctrl + Click на Create попадаю в конструктор TObject. Что
> за?

Хм... должен попасть либо на описание конструктора в твоем классе либо на его реализацию.... взависимости от расположения реализации конструктора и строки TSingleton.Create; Если строка выше реализации конструктора то Ctrl+Click попадаем в описание, ну и если ниже то в реализацию.... Вот.


 
Kolan ©   (2007-05-17 00:07) [4]

Дык это же синглетон! Его конструктор вызвать низя, поэтому он(конструктор) и помешен в strict private&#133


 
{RASkov} ©   (2007-05-17 00:09) [5]

> и помешен в strict private…

Оу щед... А я и не знаю про это... а что это? ;) Ты не указал версию делфи, я тебе про D7 рассказал... Сорри, что не помог ;)


 
Kolan ©   (2007-05-17 00:10) [6]

> взависимости от расположения реализации конструктора и строки
> TSingleton.Create;


> Пишу:
> TSingleton.Create;

В другом модуле.


 
Kolan ©   (2007-05-17 00:12) [7]

> Ты не указал версию делфи, я тебе про D7 рассказал&#133 Сорри,
> что не помог

Да, это BDS 2006. Да это и не оч. фажно strict private — это виден только внутри класса и все, в отличае от private который виден еще и всем в данном модуле.


 
Servelat ©   (2007-05-17 00:14) [8]


> TSingleton.Create;
>
> Компилится, мне что спать пора?
> Почему?


Тот конструктор, что у TObject никто не отменял. Уменьшить его видимость ты не можешь). Правда, можешь скажем объявить функцию с именем Create и тогда конструктор TObject"а виден не будет. Но только балалаечно это все имхо, необходимости не вижу.


 
{RASkov} ©   (2007-05-17 00:16) [9]

> [6] Kolan ©   (17.05.07 00:10)
> В другом модуле.

Ну так оно и верно, что попадаешь в конструктор TObject... уже рассказал Servelat ©


 
Servelat ©   (2007-05-17 00:23) [10]

> [0]
http://slil.ru/24378741
Посмотри вот в этой статейке (pdf, 1.6 метра, журнал какой-то, первая статья) достаточно интересная реализация сингелтона на Делфи. Статья на английском.


 
Дурак ©   (2007-05-17 00:32) [11]

Kolan ©   (16.05.07 23:08)
С++ от дельфи отличаем? то что применимо в плюсах - не всегда применимо в дельфи.


 
Kolan ©   (2007-05-17 07:21) [12]

> Но только балалаечно это все имхо, необходимости не вижу.

Дык этот паттерн генерится самим компилятором так! Что они(Borland) не подумали что так получится? Можно было бы другую реализацию сделать&#133

Хотя, может эта реализация и для C# подходить, а для Delphi не стали немять&#133


 
Loginov Dmitry ©   (2007-05-17 07:57) [13]

> Дык этот паттерн генерится самим компилятором так! Что они(Borland)
> не подумали что так получится? Можно было бы другую реализацию
> сделать


Что, мешает?


 
Kolan ©   (2007-05-17 08:12) [14]

> Посмотри вот в этой статейке

Сейчаc гляну.


> Что, мешает?

Мешает то, что я попарился и забыл что класс-синглетон. Написал соответственно Obj := TSingleton.Create; оно скомпилилось, а потом получил ран тайм ошибку&#133 Хотя еще на компиляции Create не должно было появится в CodeInsight, имхо.


> Тот конструктор, что у TObject никто не отменял. Уменьшить
> его видимость ты не можешь)

Подумал еще, а почему? Я его закрыл, почему его «никто не отменил»?


 
Kolan ©   (2007-05-17 08:21) [15]

Про статью, что-то даверия не внушает:
if Assigned(TimeKeeperInstance) then begin
 TimeKeeperInstance.Destroy;
 TimeKeeperInstance := nil;
end;

Про Free и FreeAndNil автор не знает?


 
Servelat ©   (2007-05-17 10:26) [16]

> [15]
Если ты сможешь мне доказать, чем FreeAndNil лучше приведенного кода, я сам съем мою мышку). У каждой задачи обычно есть больше одного решения, ничего криминального в приведенном коде я не вижу.

> Дык этот паттерн генерится самим компилятором так!
А мне казалось, что код из [0] написал ты, а не компилятор. Он то в чем виноват?

> Можно было бы другую реализацию сделать…
Вещей, которые можно бы было сделать хватит на много толстых книг. Ориентироваться надо на то, что есть, а не на то, что нам хотелось бы иметь.

> Подумал еще, а почему? Я его закрыл, почему его «никто не отменил»?
Ты не закрыл, ты объявил еще один конструктор. Тот, что унаследован от TObject"а никуда не пропал.


 
Kolan ©   (2007-05-17 10:50) [17]

> что код из [0] написал ты

Ты телепат, действительно сам написал. А компилятор(точнее Together) пишет так:
TSingleton = class
 strict private
   constructor Create;

 class var
   FInstance:TSingleton;

 public
   class function GetInstance: TSingleton;
 end;


> Тот, что унаследован от TObject"а никуда не пропал.

Я действительно понять хочу. Как так может быть два метода с одним именем и не overload?


 
Игорь Шевченко ©   (2007-05-17 10:55) [18]


> ничего криминального в приведенном коде я не вижу.


Мало работаешь. Со временем поймешь, что краткость - сестра таланта


 
Servelat ©   (2007-05-17 11:08) [19]

>[18]
Скорее всего вы правы, и когда-нибудь я это пойму. Но пока, ничего криминального в таком коде я по-прежнему не вижу).


> А компилятор(точнее Together) пишет так:

С Together не работал, так что поддержать разговор на должном уровне не смогу.


> Я действительно понять хочу. Как так может быть два метода
> с одним именем и не overload?

Такова селави. Попробуй и убедись, что такое возможно).

 TParent = class
   procedure Test;
 end;

 TChild = class(TParent)
 private
   procedure Test;
 end;

...
procedure TChild.Test;
begin
 ShowMessage("Child");
end;

procedure TParent.Test;
begin
 ShowMessage("Parent");
end;

...
// или в другом модуле, или strict private
procedure Go;
var
 Obj: TChild;
begin
 Obj := TChild.Create;
 Obj.Test;
 Obj.Free;
end;


 
Kolan ©   (2007-05-17 13:11) [20]

Получил "Child", а что я должен был получить? Все логично TParent.Test; закрыт.


 
Servelat ©   (2007-05-17 13:24) [21]

strict private сделай, или процедуру Go в другой модуль перенеси.


 
Kolan ©   (2007-05-17 13:56) [22]

> strict private сделай

Да, получил Parent&#133 Почему, что за бред?


 
Amoeba ©   (2007-05-17 16:53) [23]

Статья Шаблон Синглетон (Singleton pattern)
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=267


 
Kolan ©   (2007-05-17 21:18) [24]

> Статья Шаблон Синглетон (Singleton pattern)

Благодарю, но сцылка не работает :)



Страницы: 1 вся ветка

Текущий архив: 2007.07.22;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.031 c
15-1180700601
Сергей М.
2007-06-01 16:23
2007.07.22
Творчество Андрея Мисина


15-1182694844
Fyr
2007-06-24 18:20
2007.07.22
Ошибка №1410 (CLASS_EXIST)


2-1183048916
Yurish
2007-06-28 20:41
2007.07.22
TClientSocket TServerSocket таковых в Делфи 7 нет?


15-1181359354
MBo
2007-06-09 07:22
2007.07.22
Новый roadmap CodeGear


15-1182343810
Сатир
2007-06-20 16:50
2007.07.22
Удаление альтернативных обозревателей интренета