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

Вниз

Ключевое слово "object"   Найти похожие ветки 

 
Servelat ©   (2007-03-03 17:04) [0]

В первую очередь пошел искать в хелпе, не нашел (хотя узнал много интересного ^^), в яндексе тоже глухо. В книжках по делфи, которые мне попадались о сабже тоже нет упоминаний. Итак, что же делает ключевое слово "object"? Ссылки на документацию приветствуются, но и ответом "своими словами" не побрезгую.

ЗЫ В общем-то, какой-то конкретной цели не преследую, просто для повышения образованности.


 
Desdechado ©   (2007-03-03 17:06) [1]

Это устаревший способ работы с самодельными объектами. Теперь гораздо целесообразнее использовать class


 
Servelat ©   (2007-03-03 17:11) [2]

> Это устаревший способ работы с самодельными объектами


Моё любопытсво все еще не удовлетворено :). Чем object отличается от class, что именно устарело. Попадался мне как то код с этим волшебным словом, так что хотелось бы понять что это из себя представляет.


 
alien1769 ©   (2007-03-03 17:13) [3]

Идеальное слово для описания всего.

Даже для искуственного интелекта.


 
PEAKTOP ©   (2007-03-03 17:14) [4]

> Desdechado ©   (03.03.07 17:06) [1]
> Это устаревший способ работы с самодельными объектами. Теперь гораздо целесообразнее использовать class


В Делфях классом считается все, что прождено от TObject. Но проблема в том, что нужно было объявить сам TObject в юните "system.pas", для чего и использовали ключевое слово языка Паскаль object. Ключевое слово class не является зарезервированным словом языка Паскаль, хотя поддерживается и зарезервировано сейчас почти всеми компиляторами (Delpi, FPC, Lazarus, Kylix, TNT).


 
DrPass ©   (2007-03-03 17:17) [5]


> Чем object отличается от class, что именно устарело

object в общем-то позволяет создать статический объект. Подробнее о нем ты лучше прочитай в любом руководстве по Турбо-Паскалю 5.5-7.0, с тех пор ничего не изменилось. В Delphi object только для совместимости и поддерживается


 
Servelat ©   (2007-03-03 17:19) [6]

> [5] DrPass ©   (03.03.07 17:17)


Руководство щас погуглю.
А  под статическим объектом понимается объект, все методы которого статические? А конструктор с деструктором присутствуют? (=


 
default ©   (2007-03-03 17:22) [7]

Servelat ©   (03.03.07 17:19) [6]
нет просто память под такой объект выделяется статически, то есть при загрузке программы в память, а не когда программист соизволит


 
Ketmar ©   (2007-03-03 17:34) [8]

> PEAKTOP ©   (03.03.07 17:14) [4]
 TObject = class;
 TClass = class of TObject;

купи "твикс". жуй. молчи. заодно почитай материалы по Object Pascal (тому, из которого упёрли концепцию обёектов в Turbo Pascal 5.5).


 
Servelat ©   (2007-03-03 17:41) [9]

Собственно, вопрос закрыт; нашел у себя на винте UserGuide по BP70 (что прям удивительно, на русском), где тема полностью раскрыта, просвещаюсь. Всем спасибо за ответы.


 
TUser ©   (2007-03-03 18:43) [10]

Удобен тем, что содержит в себе идеи ООП (наследование) и не требует лишней работы и памяти. Посмотри, сколько всего делается и создается в конструкторе TObject! Если мне нужно будет использовать сотню-другую тысяч объектов, то выбор будет за object"ами, а не за классами, наверное.


 
Loginov Dmitry ©   (2007-03-03 18:58) [11]

> Если мне нужно будет использовать сотню-другую тысяч объектов,
> то выбор будет за object"ами, а не за классами, наверное.


Так и до record"a дойти не долго :))


 
PEAKTOP ©   (2007-03-03 19:03) [12]

> Ketmar ©   (03.03.07 17:34) [8]

Ты не прав.


 
TUser ©   (2007-03-03 19:11) [13]

> Loginov Dmitry ©   (03.03.07 18:58) [11]

Структурное программирование рулит. Я серьезно.


 
tesseract ©   (2007-03-03 20:52) [14]


>  Посмотри, сколько всего делается и создается в конструкторе
> TObject! Если мне нужно будет использовать сотню-другую
> тысяч объектов, то выбор будет за object"ами, а не за классами,
>  наверное.


Гм. Наверное наооборот :-)  class как раз под такие случаи и заточен :-)


 
TUser ©   (2007-03-03 21:04) [15]

> tesseract ©   (03.03.07 20:52) [14]

На пустых объектах/классах поэкспериментировал, 100000000 TObject"ов создано за 19 секунд и использовано 720 метров памяти, столько просто обджектов - за ноль секунд и использовано памяти метр с копейками. Если объекты буду содержать какие-то данные и выполнять какие-то действия, то и на сотне разницу почуствуем.


 
Loginov Dmitry ©   (2007-03-03 21:10) [16]

> использовано памяти метр с копейками


Сами-то в это верите?


 
Loginov Dmitry ©   (2007-03-03 21:11) [17]

> Если объекты буду содержать какие-то данные и выполнять
> какие-то действия, то и на сотне разницу почуствуем.


Или эта разница просто-напросто исчезнет.


 
TUser ©   (2007-03-03 21:24) [18]

> Сами-то в это верите?

Четырехзначная цифирь, начинается на один ...


 
vuk ©   (2007-03-03 22:13) [19]

to PEAKTOP ©   (03.03.07 17:14) [4]:
Что за трава? Или это были грибы? :)))

to TUser ©   (03.03.07 21:04) [15]:
>На пустых объектах/классах поэкспериментировал
Угу, а производительность будем на "Hello, World!" мерять. :)
Пустой object занимает 0 байт, в отличие от наследника TObject, который занимает 4 минимум байта.

>Если объекты буду содержать какие-то данные и выполнять какие-то
>действия, то и на сотне разницу почуствуем.
Фиг. Если в object будет поле, допустим integer, вес уравняется. Преимуществ не будет почти никаких. При одинаковом количестве полей будут те самые 400 байт на сотне.

И вообще, что-то цифры подозрительные. Что там в коде-то?


 
Игорь Шевченко ©   (2007-03-04 00:06) [20]

TUser ©   (03.03.07 21:04) [15]

Тут такой момент - пустые объекты, как и пустые классы никому не нужны. Давай ты полные насоздаешь ?


 
TUser ©   (2007-03-04 04:27) [21]

33 секунды для объектов vs минута думанья и Out of memory в случае классов :) Объекты и классы содержали по два поля типа integer + то, что от TObject. Говорю же - объекты (те, которые экземпляры классов) память любят кушать. Больше, чем объекты, которые просто, т.е. типа record с наследованием.


 
Loginov Dmitry ©   (2007-03-04 08:56) [22]

> Говорю же - объекты (те, которые экземпляры классов) память
> любят кушать. Больше, чем объекты, которые просто, т.е.
> типа record с наследованием.


Ай-ай! Какая беда! 100000000 объектов всю память скушали!
Только нюансик один: что вообще в принципе можно делать с таким количеством объектов? Их же надо где-то индексировать (в массиве там, или в списке), это еще 400 метров памяти надо. Нужен метод доступа, поиска и т.п., что при таком количестве объектов (будь то object или class) будет выполняться катастрофически долго.
То есть пример со 100000000 объектов выглядет очень уж надуманным.


 
vuk ©   (2007-03-04 10:57) [23]

to TUser ©   (04.03.07 04:27) [21]:
>Говорю же - объекты (те, которые экземпляры классов) память любят
>кушать. Больше, чем объекты, которые просто, т.е. типа record с
>наследованием.
А вот мои подсчеты говорят, что памяти в результате понадобится одинаковое количество. Догадываетесь, почему? А времени, тут да, создание экземпляра класса требует чуть больше, т.к. экземпляру класса требуется инициализация, а у object её по-умолчанию нет, но это опять же, до тех пор пока там данных в нормальном количестве нет.

Поэтому еще раз говорю, что-то там не то с методикой. Код в студию.


 
vuk ©   (2007-03-04 11:17) [24]

Чтобы вопросов не возникало:


program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils,
 Windows;

type
 Cls = class
   a,b: integer;
 end;

 PObj = ^Obj;
 Obj = object
 private
   a,b: integer;
 end;
 

procedure AllocCls(count: integer);
var
 i: integer;
begin
 for i := 0 to Count - 1 do
   Cls.Create;
end;  

procedure AllocObj(count: integer);
var
 i: integer;
 o: PObj;
begin
 for i := 0 to Count - 1 do
   new(o);
end;  

var
 T1, T2, T3: Cardinal;
 S1, S2, S3: Cardinal;
begin
 T1 := GetTickCount;
 S1 := GetHeapStatus.TotalAllocated;
 AllocCls(10000000);
 S2 := GetHeapStatus.TotalAllocated;
 T2 := GetTickCount;
 AllocObj(10000000);
 S3 := GetHeapStatus.TotalAllocated;
 T3 := GetTickCount;
 writeln(Format("%d  %d", [T2-T1, S2-S1]));
 writeln(Format("%d  %d", [T3-T2, S3-S2]));  
 readln;
end.


Результат (CoreDuo 6600 2.4 ГГц, RAM 2ГБ):
500  120000000
109  120000000

Памяти требуют оба варианта, что естественно для данного случая, одинаково, несмотря на разницу в размерах экземпляров. А чем разница во времени обусловлена - см. выше.


 
Olivetti   (2007-03-04 12:23) [25]

Но проблема в том, что нужно было объявить сам TObject в юните "system.pas", для чего и использовали ключевое слово языка Паскаль object

О как. Оказывается, object использовали для создания class. Вот так и возникают религии. Хвала всевышнему, объект придумавшему, ибо класс и экземпляр класса - суть порождение его. Во имя object, class и instance его! Аминь.


 
Virgo_Style ©   (2007-03-04 12:29) [26]

Я, наверное, еретик... бо у меня возник вопрос, откуда же в таком случае взялся сам object :0)

и если от record"а, то откуда взялся record? и так далее... )


 
vuk ©   (2007-03-04 12:37) [27]

to Virgo_Style ©   (04.03.07 12:29) [26]:
>откуда взялся record?
record был всегда :)


 
Virgo_Style ©   (2007-03-04 12:50) [28]

vuk ©   (04.03.07 12:37) [27]
Аминь %-)


 
Palladin ©   (2007-03-04 13:25) [29]

record придумал Вирт, а Вирта придумали мама с папой... выводы очевидны :)


 
default ©   (2007-03-04 13:46) [30]

хех
неужто настолько делать нефига  людям что ещё не влом думать о такой архаике как object:)


 
Ketmar ©   (2007-03-04 14:03) [31]

> PEAKTOP ©   (03.03.07 19:03) [12]
расслабься. приведённый мной код -- цитата из system.pas. советую перед тем, как вещать, таки читать генофонд. ну и -- да, язык, о котором вещаешь, тоже выучить бы не помешало.


 
просто так   (2007-03-04 14:07) [32]

>>неужто настолько делать нефига  людям что ещё не влом думать о такой архаике как object:)
что за наезды на обжект? фундаментальная штука. это класс придумка борланда, насколько помню в стандарте паскаля нет такого словечка:)


 
_uw_   (2007-03-04 14:08) [33]

object - это отнюдь не архаика.

Во-первых, без слова object затруднительно определить callback типа

type
 TForProgressBar = procedure(Current, Total: Integer) of object;

Это, ясное дело, очень мощное и "современное" средство, не реализованное, к примеру, в С++. Там аналог убогий.

Во-вторых, object позволяет создавать "интеллектуальные записи" (с методами), которые к тому же обладают свойством наследования. В некоторых диалектах С я встречал это свойство "наследования" с применением анонимных структур.


 
Ketmar ©   (2007-03-04 14:10) [34]

> просто так   (04.03.07 14:07) [32]
я-таки скажу откровение: в том стандарте и object ни разу нет.


 
просто так   (2007-03-04 14:15) [35]


> я-таки скажу откровение: в том стандарте и object ни разу
> нет

да, точно ))), но класс развитие обжекта, причем не всегда удобное, и объявлять обжект устаревшим неправильно, для небольших структур данных он подходит гораздо больше чем класс


 
default ©   (2007-03-04 14:16) [36]

_uw_   (04.03.07 14:08) [33]
ну я не про все применения ключевого слова object, а именно про то применение которое оставлено для совместимости

в .NET структуры наделённые свойствами ООП юзаются порой в качестве "легковесных" объектов ибо для них в стеке память выделяется(то есть быстро) и освобождается быстро(а не когда GC соизволит)
в каком-то таком же смысле использования object-объектов возможно и может быть оправдано



Страницы: 1 вся ветка

Текущий архив: 2007.03.25;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.031 c
2-1173027229
Chaval'
2007-03-04 19:53
2007.03.25
Тип db


2-1172733688
Riply
2007-03-01 10:21
2007.03.25
Индекс объекта, возвращаемого MsgWaitForMultipleObjects


2-1172742458
Ega23
2007-03-01 12:47
2007.03.25
Поведение VarType


3-1167223500
wipr
2006-12-27 15:45
2007.03.25
Поломка базы IB (checksum error on database page 38260)


15-1172502904
IMHO
2007-02-26 18:15
2007.03.25
Посоветуйте утилиту для Интернета