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

Вниз

Использование 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.014 c
14-5135
Teapot
2003-01-16 16:38
2003.02.03
Компонент DialUp


1-4993
xxxCrazyManxxx
2003-01-23 16:14
2003.02.03
Help on Click


1-5008
Brain
2003-01-23 15:51
2003.02.03
Если нет procedure Paint;


3-4713
ledzzz
2003-01-17 17:53
2003.02.03
штрихкод


14-5242
Igit
2003-01-14 21:13
2003.02.03
Номенклатура вирусов