Форум: "Основная";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];
ВнизИспользование object Найти похожие ветки
← →
euru (2003-01-22 20:15) [0]Чем чревато использование типов, созданных на основе object?
← →
Nick_N_A (2003-01-23 05:41) [1]У них
-вырублен RTTI интерфейс,
-отсутствует поддержка сохранения/загрузки свойств
-Нет ничего похожего на координаты
← →
Думкин (2003-01-23 06:52) [2]Ничем - если с головой дружишь.
← →
Reindeer Moss Eater (2003-01-23 08:36) [3]А что такое у тебя object ?
← →
euru (2003-01-23 09:07) [4]Начался новый рабочий день...
>Nick_N_A ©
Что ты подразумеваешь под координатами?
>Думкин ©
Идея есть: использовать object вместо record - в разумных, конечно, пределах.
>Reindeer Moss Eater
object - это ключевое слово
← →
Думкин (2003-01-23 09:10) [5]
> >Reindeer Moss Eater
> object - это ключевое слово
Речь все-таки, видимо, о TObject?
> >Думкин ©
> Идея есть: использовать object вместо record - в разумных,
> конечно, пределах.
Если разумны не только пределы, то мысль разумная.
← →
euru (2003-01-23 09:18) [6]> Думкин ©
> Речь все-таки, видимо, о TObject?
Да нет, TObject - это class, а я говорю про старый, еще TurboPascal"евский, object.
Если переменную типа object объявлять статически, то она практически ничем не отличается от record, только у object еще могут быть методы, удобные для работы с переменной
← →
Reindeer Moss Eater (2003-01-23 09:23) [7]использование типов, созданных на основе object?
А научи ка нас создать тип, наследованый от Object
← →
euru (2003-01-23 09:33) [8]> Reindeer Moss Eater
> А научи ка нас создать тип, наследованый от Object
Вообще-то, я про наследование от object ничего не говорил, а типы создаются просто:
type
a = object
m1: ...
m2: ...
end;
И можно даже так:
type
b = object(a)
m3: ...
m4: ...
end;
Плюс ко всему конструкторы, деструктор, методы и т.д.
← →
Думкин (2003-01-23 09:36) [9]Object types are supported for backward compatibility only. Their use is not recommended.
← →
Reindeer Moss Eater (2003-01-23 09:40) [10]Тогда простой и внятный ответ из документации:
Object types are supported for backward compatibility only. Their use is not recommended.
← →
Anatoly Podgoretsky (2003-01-23 09:44) [11]И только этим и надо руководствоваться и ничем другим.
← →
euru (2003-01-23 09:46) [12]>Думкин ©
>Object types are supported for backward compatibility only. Their use is not recommended.
Это пишется еще с D1. Уже сменилось 7 версий. В шести из них object поддерживается. D7 я не видел, но думаю, что и там он есть. Что-то подозрительно долго держится эта обратная совместимость...
← →
Reindeer Moss Eater (2003-01-23 09:49) [13]Чем чревато использование типов, созданных на основе object?
Тем, что когда-нибудь backward compatibility может внезапно кончиться
← →
Думкин (2003-01-23 09:57) [14]Все верно, такие вещи могут более десяти лет продолжать поддерживаться - а потом кирдык, и все.
← →
euru (2003-01-23 10:20) [15]1. Что-то я навскидку не могу припомнить ни одного неожиданного и бесповоротного кирдыка.
2. Хоть я и не сторонник KOL, но там object с успехом применяют - и не первый год.
3. Так как не было возражений, я так понимаю в D7 все-таки object еще есть. Значит, пока время кирдыка не настало.
Но меня больше всего интересовала чреватость использования object в текущих версиях Delphi.
← →
Reindeer Moss Eater (2003-01-23 10:25) [16]При такой постановке вопроса ничего чреватого (чреватнее чем использование любых других поддерживаемых типов) нет.
← →
uw (2003-01-23 10:34) [17]Чревато тем, что типом класс пользоваться удобнее, свойства в нем есть, классовые процедуры и т.д.
← →
REA (2003-01-23 10:44) [18]А жаль кстати - классы VCL тяжеловаты и от них (неупакованных ресурсов, RTTI и т.п.) пучит exe.
← →
Calm (2003-01-23 11:08) [19]
> Чревато тем, что типом класс пользоваться удобнее, свойства
> в нем есть, классовые процедуры и т.д.
Если не ошибаюсь, свойства можно использовать и в object.
А методы класса... Вы часто ими пользуетесь?
> А жаль кстати - классы VCL тяжеловаты и от них (неупакованных
> ресурсов, RTTI и т.п.) пучит exe.
В Delphi сложновато совсем не использовать классы. Выполнение некоторых типов на основе object практические не уменьшит разрмер exe. А если использовать object везде - прямая дорога к KOL.
← →
euru (2003-01-23 11:09) [20]>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
← →
Игорь Шевченко (2003-01-23 11:22) [21]А смысл откатываться во вчерашний день и использовать object ?
Если только Кладову в копилку копеечку положить ?
← →
Anatoly Podgoretsky (2003-01-23 11:33) [22]euru (23.01.03 10:20)
Освежим твою память: Interrupt, inline, port, mem список можно продолжить, просто больше по памяти не помню.
← →
euru (2003-01-23 11:53) [23]>Игорь Шевченко ©
>А смысл откатываться во вчерашний день и использовать 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.
← →
euru (2003-01-23 12:01) [24]>Anatoly Podgoretsky ©
>Освежим твою память: Interrupt, inline, port, mem список можно продолжить, просто больше по памяти не помню.
Ну, не надо утрировать. Хотя от inline в том виде, в каком он есть в C++, я бы не отказался
← →
Игорь Шевченко (2003-01-23 12:17) [25]euru (23.01.03 11:53)
Наследовать от record"a в общем случае не получится, так как в начало объекта добавится поле VMT.
С локальными переменными - ведь не очень трудно сначала создать объект от TObject, а по finally удалить его.
Зато выигрыш от использования class гораздо больше.
← →
euru (2003-01-23 12:43) [26]> Игорь Шевченко ©
> Наследовать от record"a в общем случае не получится, так как в начало объекта добавится поле VMT.
От record"а ни в каком случае наследования не получится - синтаксис не позволит. А разве в VMT добавляется информация, если не использовать виртуальные методы?
> .. не очень трудно сначала создать объект от TObject, а по finally удалить его
Такая возможность остается и при использовании object (особенно если создавать его динамически). Однако при статическом объявлении программы этого делать необязательно (если в объекте не используются динамические ресурсы). => Увеличение скорости работы программы (нет динамического выделения память, не используется обработка исключительных ситуаций), возможное уменьшение размера программы (по тем же причинам + object менее ресурсоемок, чем class), да и исходники в размерах могут уменьшится (хотя это некритично)
← →
Игорь Шевченко (2003-01-23 12:55) [27]
> Увеличение скорости работы программы (нет динамического
> выделения память, не используется обработка исключительных
> ситуаций)
Это тем более некритично. Разница в несколько команд...Не станешь же ты создавать и уничтожать объект в цикле из 1000000 итераций.
> От record"а ни в каком случае наследования не получится
> - синтаксис не позволит
Почему же?
type
A = record
...
end;
B = object
AA : A;
end;
Можно методы добавлять...
← →
Думкин (2003-01-23 13:06) [28]Вот дался этот объем и пара процентов увеличения скорости, что тоже не факт.
Если мы проги на дисках отписываем мне вообще на объем ехе по барабану. Конечно, я не сумасшедший создавать его диким объемом (как тут однажды было около 100 Метров). Ну не хочешь объема - не пиши в Дельфи, делов то, или юзай свое.
По мне так работать легче и быстрее - а пользовать код, который с некоторой долей вероятия накроется в будущем - зачем?
Ведь на чистом английском говорят: "завязывай с этим". И потом доказывай, что ты всю жизнь в школе немецкий учил.. :-)
← →
euru (2003-01-23 13:17) [29]> Игорь Шевченко ©
> Это тем более некритично. Разница в несколько команд...Не станешь же ты создавать и уничтожать объект в цикле из 1000000 итераций.
А если необходим массив из большого количества этих объектов? Тогда все равно нужны будут циклы для создания и уничтожения этих объектов.
> Почему же?
Наверно, B тоже record, иначе почему A не object. Но в любом случае это не наследование, а, если я не ошибаюсь, агрегация со всеми вытекающими отсюда последствиями.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.151 c