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

Вниз

TObject.Create   Найти похожие ветки 

 
Viktor Kushnir ©   (2002-10-03 07:08) [0]

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

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


 
andrey_pst ©   (2002-10-03 07:18) [1]

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

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

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

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


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

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


 
Viktor Kushnir ©   (2002-10-03 07:54) [3]

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

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

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



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


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


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


 
Внук ©   (2002-10-03 09:34) [5]

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


 
Viktor Kushnir ©   (2002-10-04 06:59) [6]

Спасибо.


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

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


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

andrey_pst © (04.10.02 08:11)

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

С уважением,


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

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


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

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


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

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

А стоит ли ?


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

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


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

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


 
andrey_pst ©   (2002-10-04 11:51) [14]

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

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


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

andrey_pst © (04.10.02 11:51)

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

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

С уважением,


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

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

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



 
andrey_pst ©   (2002-10-04 13:43) [17]

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



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

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

Наверх




Память: 0.51 MB
Время: 0.018 c
1-45248
ДСН
2002-10-03 14:56
2002.10.14
Вывод информации на печать и её предварительный просмотр.


1-45318
iMAN
2002-10-04 01:43
2002.10.14
Minimize...


3-45188
DDDD
2002-09-20 15:39
2002.10.14
Вычитание


8-45472
Beeper
2002-06-11 23:35
2002.10.14
Flash


1-45253
Демонов Е.В.
2002-10-04 10:40
2002.10.14
Рисование Кнопок