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

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

Использование object


Страницы:   1 2

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.


Страницы:   1 2

Наверх

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