Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TObject.Create


Viktor Kushnir ©   (2002-10-03 07:08:00) 

А вот расскажите мне, Метод Create используется только для создания нового экземпляра класса?
MyObject := TObject.Create
или есть случаи когда используется вызов
MyObject.Create
или
NyNewObject := MyObject.Create

Если используется,то где и когда?


andrey_pst   (2002-10-04 13:43:00) [1]

>>Игорь Шевченко
Все гениальное просто :))


Юрий Зотов   (2002-10-04 13:19:00) [2]

> Есть ли стучаи, когда программисту нужно вызывать медтод Create
> у уже созданного класса/объекта?

Есть, и очень много. Каждый вызов inherited Create внутри конструктора - это как раз то самое.


Игорь Шевченко   (2002-10-04 12:16:00) [3]

andrey_pst © (04.10.02 11:51)

Правильные пацаны делают так: Объявляют приватный метод ClearFields, вызывают его из конструктора и из любого места, где надо очистить поля :-)

Повторный вызов конструктора чреват в общем случае потенциальной утечкой ресурсов. Оно надо ?

С уважением,


andrey_pst   (2002-10-04 11:51:00) [4]

>>Игорь Шевченко
получается нужно просто не забыть сделать MyClass := nil; и проблем не будет ?

Довольно гемморойный и опасный способ повторной инициализации полей объекта.
Интересно, намного он быстрее работает, чем установка значений полей через методы, допустим, если полей много - штук так 500 ?


Рыжик   (2002-10-04 11:38:00) [5]

Нда, спросила и сама поняла ответ на свой вопрос 8)


Рыжик   (2002-10-04 11:35:00) [6]

Просто интересно. Например, если в конструкторе выделяется память для чего-нибудь, то если объект уже существует, чтобы её ещё раз не выделять.


Игорь Шевченко   (2002-10-04 11:26:00) [7]

Рыжик © (04.10.02 11:24)

А стоит ли ?


Рыжик   (2002-10-04 11:24:00) [8]

А можно ли в конструкторе узнать, каким образом он был вызван: MyClass:=TMyClass.Create или NewClass:=MyClass.Create?


REA   (2002-10-04 10:24:00) [9]

На месте компилятора я бы warning выдавал при такой конструкции, но "что не запрещено, то разрешено". После C++ очень необычно выглядят паскалевские конструкторы и деструкторы.


Игорь Шевченко   (2002-10-04 09:41:00) [10]

andrey_pst © (04.10.02 08:11)

В воздух. Поэтому способ этот надо применять (если вообще надо применять) с большой острожностью.
Вообще, популярность того или иного хитрого метода можно определить по тому, насколько часто он встречается в исходных текстах VCL, IMHO

С уважением,


andrey_pst   (2002-10-04 08:11:00) [11]

>>Внук
а куда будет ссылаться MyClass после NewClass.Free; ?


Viktor Kushnir   (2002-10-04 06:59:00) [12]

Спасибо.


Внук   (2002-10-03 09:34:00) [13]

>>Viktor Kushnir © (03.10.02 07:54)
У уже существующего объекта можно вызывать констуктор так, как Вы написали. Нужно только помнить о следующих различиях: если конструктор вызывается как метод класса (MyClass:=TMyClass.Create), то выделяется блок памяти под объект, исполняется код самого конструктора и принимающей переменной присваивается ссылка на только что созданный экземпляр класса, либо происходит исключение, если объект не удалосб создать.
В случае, когда конструктор вызван как обычный метод (MyClass.Create), создания нового объекта не происходит, а просто исполняется код самого конструктора. Такой вызов можно использовать для повторной быстрой инициализации объекта. После вызова NewClass:=MyClass.Create переменная NewClass будет ссылаться на тот же объект, что и MyClass.


Тормоз   (2002-10-03 08:12:00) [14]


> Есть ли стучаи, когда программисту нужно вызывать медтод
> Create
> у уже созданного класса/объекта?


Это смотря что представляет из себя м-д Create
если, например, м-д Create предусматривает инициализацию нового экземпляра значениями свойств породившего экземпляра, то почему бы не создать объект таким способом.
Другое дело, что что так никто не делает.
Надеюсь моя мысль ясна


Viktor Kushnir   (2002-10-03 07:54:00) [15]

Я наверно плохо выразился.
Я знаю как и что надо создавать. Благо не впервый раз :)
Я спрашивал следующее:

Есть ли стучаи, когда программисту нужно вызывать медтод Create
у уже созданного класса/объекта?

Или же метод Create может использоваться только для создания экземпляра и не для чего более?


andrey_pst   (2002-10-03 07:18:00) [16]

Не совсем понял вопрос.
Делается так:
type
TMyObj = class(TObject)
private
public
end;
...
var
MyObj : TMyObj;
...
MyObj := TMyObj.Create;
...

Так нельзя:
MyObj.Create;

Это вообще бред:
NyNewObject := MyObj.Create

Почитайте книжки по ООП.


Kacnep   (2002-10-03 07:18:00) [17]

Хм...
Думаю не побъют если скажу так (не говорю на 100% что верно, но я помню так)
1 Строка ВЕрна и только так
2 Строка В корне не верна - так экземпляр класса не создается...
3 Строка Создашь экземпляр класса MyObject так только после того вроде как создал свой класс MyObject
А вообе очень классно все в книжке Трепалина объяснено! Просто супер! Лучше бы изучать Дельфу я начал с нее... :(
Она есть в Эл виде нашел в Инете... при поисках документации по Дельфу...
Усе вроде


Наверх

Титульная страница Поиск, карта сайта Написать письмо