Форум: "Основная";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];
Вниз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…
← →
{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 рассказал… Сорри,
> что не помог
Да, это 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) не подумали что так получится? Можно было бы другую реализацию сделать…
Хотя, может эта реализация и для C# подходить, а для Delphi не стали немять…
← →
Loginov Dmitry © (2007-05-17 07:57) [13]> Дык этот паттерн генерится самим компилятором так! Что они(Borland)
> не подумали что так получится? Можно было бы другую реализацию
> сделать
Что, мешает?
← →
Kolan © (2007-05-17 08:12) [14]> Посмотри вот в этой статейке
Сейчаc гляну.
> Что, мешает?
Мешает то, что я попарился и забыл что класс-синглетон. Написал соответственноObj := TSingleton.Create;
оно скомпилилось, а потом получил ран тайм ошибку… Хотя еще на компиляции 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… Почему, что за бред?
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.036 c