На главную
Подписка
Новости


Рейтинг@Mail.ru











Главная / DELPHI / Часто задаваемые вопросы и ответы на них / Object Pascal / Чем принципиально отличаются классы от объектов? Сделать домашней страницей Добавить в избранное Написать писмо

Чем принципиально отличаются классы от объектов?


»»» Palladin (28.07.00 12:39)
Чем принципиально отличаются классы от объектов?

»»» Диман - makaev@pisem.net (28.07.00 13:05)
Объект - это экземпляр класса.

»»» ASCRUS - ascrus@aport.ru (28.07.00 13:47)
если ты имеешь ввиду под понятием обьекты: обьектыне типы, которые описывались ранее в Object Pascal (ключевое слово object), то в Delphi class - это то же самое плюс свойства, события и RTTI (то есть возможность делать публицируемые свойства).

»»» Alexander - avolkov@infostroy.ru (28.07.00 13:48)
Согласен с предыдущим с точки зрения анализа. Еще - объект отличается наличием данных (атрибутов или в терминологии Delphi полей, свойств, указателей на обработчиков событий). Класс данных не имеет, кроме реализованных в виде функций класса и предопределенных в TClass атрибутов, например ClassName.

»»» SergSuper - sergsuper@mail.ru (28.07.00 14:24)
Не совсем так. Класс тоже ведь имеет данные.
t=class X:char end - X это что, не данные?
Дело в следующем. Первоначально появился object - что-то вроде record-а, но с процедурами, наследованием и т.д. Использовались обычно объекты динамически, т.е. приходилось описывать тип данных объект и тип ссылку на него. Чтобы создать нечто динамическое надо было использовать функцию New. В итоге всё получалось несколько громоздко.
В Delphi решили работать с объектами по-другому, т.е. объект(который class) это уже сразу ссылка, еще один тип объявлять не надо, New тоже не надо вызывать. Все новые возможности реализовали только в классах, а object оставили для совместимости.

Ну а принципиальные различия между class и object, как видно из вышеописаного:
1. Класс это ссылка
2. В классы реализованы новые возможности.
Если не имеются в виду паскалевские термины, то объект и класс это обычно одно и тоже, ну может быть "объект - это экземпляр класса".

»»» Alexander - avolkov@infostroy.ru (28.07.00 15:13)
Да, тут нечего сказать. Super поставил жирную точку в дискусси, не удосужившись понять о чем я писал.
Написав "t=class X: char; end;" Вы не сможете обратиться к данным "t.X := #13;", поскольку память под эти "данные" не выделена. Понятно? Не верите, можете попробовать. И вообще, прежде чем писать пример кода, неплохо было бы его хотя-бы откомпилировать без ошибок.

»»» Диман - makaev@pisem.net (28.07.00 15:38)
Вот я и говорю: Объект - это экземпляр класса.
т.е. объект, это тотже класс, под который выделена
память и с которым уже можно работать.

»»» SergSuper - sergsuper@mail.ru (28.07.00 16:02)
Ну зачем же так. Очень я даже удосужился.
А Ваш последний мессаждь действительно мне непонятен, чего я не скрываю. Написав t=class Вы объявляете тип и естественно не можете присвоить данные типу. Естественно такое компилироваться не будет и я не пытался его компилировать. Вам же не придет в голову писать "t=record X: char; end" и потом обращаться к данным "t.X := #13;". Так что Ваши возражения не принимаю.
Чтобы окончательно снять вопросы приведу пример идентичного объекта реализованного через object и через class

---object-----
type
to=object(TObject)
x:byte
end;
po=^to;
var o:po;
begin
o:=New(po,Init)
o^.x=#13;
Dispose(o,Done)
end

---class-----
type
to=class(TObject)
x:byte
end;
var o:to;
begin
o:=to.Create
o.x=#13;
o.Free
end


Т.е. когда пишется через object есть и объект(to) и ссылка на него (po). Когда пишется через class есть только ссылка(to).
Я думаю, что для Alexander-а я ничего нового не написал, спор имеет чисто теоритический характер, но может кому-то, кто не писал на Паскале 6 или 7, будет интересно.


»»» Palladin (31.07.00 17:40)
Короче, я понял, что объекты в Delphi еще можно использовать. И тут вопрос возник другой. На счет того что имя класса сразу является указателем я понял, но тогда вопрос: можно ли написать класс с нуля или без TObjecta не обойтись?

»»» ASCRUS - ascrus@aport.ru (01.08.00 08:34)
Да ты прав - даже если ты напишешь типа to = class, то все равно это будет означать to = class(TObject). Естественно это сделанно из-за RTTI

»»» SergSuper - sergsuper@mail.ru (01.08.00 09:07)
Если использовать object - то будет без без TObject, чисто твой объект. Если class - то прицепляется автоматом.

-= Из конференции сайта MASTERS OF DELPHI (http://delphi.mastak.com) =-

Copyright ©   "Мастера DELPHI"   E-mail:   delphi@mastak.com  http://www.delphimaster.ru
Источник получения информации: http://www.delphimaster.ru
Hosted by uCoz