Текущий архив: 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