![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование object
euru © (2003-01-22 20:15:00)Чем чревато использование типов, созданных на основе object?
euru (2003-01-23 13:17:00) [1]> Игорь Шевченко ©
> Это тем более некритично. Разница в несколько команд...Не станешь же ты создавать и уничтожать объект в цикле из 1000000 итераций.
А если необходим массив из большого количества этих объектов? Тогда все равно нужны будут циклы для создания и уничтожения этих объектов.
> Почему же?
Наверно, B тоже record, иначе почему A не object. Но в любом случае это не наследование, а, если я не ошибаюсь, агрегация со всеми вытекающими отсюда последствиями.
Думкин (2003-01-23 13:06:00) [2]Вот дался этот объем и пара процентов увеличения скорости, что тоже не факт.
Если мы проги на дисках отписываем мне вообще на объем ехе по барабану. Конечно, я не сумасшедший создавать его диким объемом (как тут однажды было около 100 Метров). Ну не хочешь объема - не пиши в Дельфи, делов то, или юзай свое.
По мне так работать легче и быстрее - а пользовать код, который с некоторой долей вероятия накроется в будущем - зачем?
Ведь на чистом английском говорят: "завязывай с этим". И потом доказывай, что ты всю жизнь в школе немецкий учил.. :-)
Игорь Шевченко (2003-01-23 12:55:00) [3]
> Увеличение скорости работы программы (нет динамического
> выделения память, не используется обработка исключительных
> ситуаций)
Это тем более некритично. Разница в несколько команд...Не станешь же ты создавать и уничтожать объект в цикле из 1000000 итераций.
> От record"а ни в каком случае наследования не получится
> - синтаксис не позволит
Почему же?
type
A = record
...
end;
B = object
AA : A;
end;
Можно методы добавлять...
euru (2003-01-23 12:43:00) [4]> Игорь Шевченко ©
> Наследовать от record"a в общем случае не получится, так как в начало объекта добавится поле VMT.
От record"а ни в каком случае наследования не получится - синтаксис не позволит. А разве в VMT добавляется информация, если не использовать виртуальные методы?
> .. не очень трудно сначала создать объект от TObject, а по finally удалить его
Такая возможность остается и при использовании object (особенно если создавать его динамически). Однако при статическом объявлении программы этого делать необязательно (если в объекте не используются динамические ресурсы). => Увеличение скорости работы программы (нет динамического выделения память, не используется обработка исключительных ситуаций), возможное уменьшение размера программы (по тем же причинам + object менее ресурсоемок, чем class), да и исходники в размерах могут уменьшится (хотя это некритично)
Игорь Шевченко (2003-01-23 12:17:00) [5]euru (23.01.03 11:53)
Наследовать от record"a в общем случае не получится, так как в начало объекта добавится поле VMT.
С локальными переменными - ведь не очень трудно сначала создать объект от TObject, а по finally удалить его.
Зато выигрыш от использования class гораздо больше.
euru (2003-01-23 12:01:00) [6]>Anatoly Podgoretsky ©
>Освежим твою память: Interrupt, inline, port, mem список можно продолжить, просто больше по памяти не помню.
Ну, не надо утрировать. Хотя от inline в том виде, в каком он есть в C++, я бы не отказался
euru (2003-01-23 11:53:00) [7]>Игорь Шевченко ©
>А смысл откатываться во вчерашний день и использовать object ?
>Если только Кладову в копилку копеечку положить ?
Еще раз. object - это расширение record, а не замена class.
Пример:
TExRect = object
private
FA, FB: TPoint;
public
constructor Create(L, T, Rt, B: Integer); overload;
constructor Create(const LT, BR: TPoint); overload;
constructor Create(const R: TRect); overload;
constructor Create(const ExR: TExRect); overload;
procedure Move(Delta: TPoint);
...
property Left: Integer ...
property Top: Integer ...
...
property LeftTop: TPoint ...
property RightBotton: TPoint ...
property R: TRect ...
property Width: Integer ...
property Heigth: Integer ...
...
end;
Смысл:
1. Объявление переменной такого типа (не указателя) автоматически выделит память под ее поля. => Если локально объявлять в процедурах, то при выходе из них память автоматически освобождается - деструктор использовать необязательно (он нужен только в случае, если объект сам использует динамические ресурсы).
2. Отпадает необходимость писать внешние процедуры для инициализации объекта и получения от него дополнительной информации - это возложено на сам объект.
3. Появляется инкапсуляция, наследование и полиморфизм, чего не хватает типам на основе record.
Anatoly Podgoretsky (2003-01-23 11:33:00) [8]euru (23.01.03 10:20)
Освежим твою память: Interrupt, inline, port, mem список можно продолжить, просто больше по памяти не помню.
Игорь Шевченко (2003-01-23 11:22:00) [9]А смысл откатываться во вчерашний день и использовать object ?
Если только Кладову в копилку копеечку положить ?
euru (2003-01-23 11:09:00) [10]>uw ©
Пример:
program Project1;
uses
SysUtils;
type
TA = object
private
F1: Integer;
F2: Integer;
procedure setF2(Value: Integer);
public
constructor create(a1, a2: Integer);
class function mc(): String;
property P1: Integer read F1;
property P2: Integer read F2 write setF2;
end;
constructor TA.create(a1, a2: Integer);
begin
F1 := a1; F2 := a2;
end;
procedure TA.setF2(Value: Integer);
begin
if Value > 0 then F2 := Value
else raise Exception.Create("Error");
end;
class function TA.mc(): String;
begin
Result := "TA";
end;
var
a: TA;
begin
a.create(1, 2);
a.P2 := a.P1 + 5;
writeln(a.mc, a.P1, a.p2);
end.
Работает. Правда TA.mc() не проходит, но я изначально object рассматривал не как альтернативу class, а как расширение record
Calm (2003-01-23 11:08:00) [11]
> Чревато тем, что типом класс пользоваться удобнее, свойства
> в нем есть, классовые процедуры и т.д.
Если не ошибаюсь, свойства можно использовать и в object.
А методы класса... Вы часто ими пользуетесь?
> А жаль кстати - классы VCL тяжеловаты и от них (неупакованных
> ресурсов, RTTI и т.п.) пучит exe.
В Delphi сложновато совсем не использовать классы. Выполнение некоторыхтипов на основе object практические не уменьшит разрмер exe. А если использовать object везде - прямая дорога к KOL.
REA (2003-01-23 10:44:00) [12]А жаль кстати - классы VCL тяжеловаты и от них (неупакованных ресурсов, RTTI и т.п.) пучит exe.
uw (2003-01-23 10:34:00) [13]Чревато тем, что типом класс пользоваться удобнее, свойства в нем есть, классовые процедуры и т.д.
Reindeer Moss Eater (2003-01-23 10:25:00) [14]При такой постановке вопроса ничего чреватого (чреватнее чем использование любых других поддерживаемых типов) нет.
euru (2003-01-23 10:20:00) [15]1. Что-то я навскидку не могу припомнить ни одного неожиданного и бесповоротного кирдыка.
2. Хоть я и не сторонник KOL, но там object с успехом применяют - и не первый год.
3. Так как не было возражений, я так понимаю в D7 все-таки object еще есть. Значит, пока время кирдыка не настало.
Но меня больше всего интересовала чреватость использования object в текущих версияхDelphi.
Думкин (2003-01-23 09:57:00) [16]Все верно, такие вещи могут более десяти лет продолжать поддерживаться - а потом кирдык, и все.
Reindeer Moss Eater (2003-01-23 09:49:00) [17]Чем чревато использование типов, созданных на основе object?
Тем, что когда-нибудь backward compatibility может внезапно кончиться
euru (2003-01-23 09:46:00) [18]>Думкин ©
>Object types are supported for backward compatibility only. Their use is not recommended.
Это пишется еще с D1. Уже сменилось 7 версий. В шести из них object поддерживается. D7 я не видел, но думаю, что и там он есть. Что-то подозрительно долго держится эта обратная совместимость...
Anatoly Podgoretsky (2003-01-23 09:44:00) [19]И только этим и надо руководствоваться и ничем другим.
Reindeer Moss Eater (2003-01-23 09:40:00) [20]Тогда простой и внятный ответ из документации:
Object types are supported for backward compatibility only. Their use is not recommended.