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

Вниз

классы и объекты   Найти похожие ветки 

 
Kolyan ©   (2004-03-28 14:49) [0]

Вот люди,я понять не могу, помогите, растолкуйте и/или приведите примеры. Чем класс от объекта отличается а?


 
Kerk ©   (2004-03-28 14:53) [1]

В одном смысле, объект - это экземпляр класса.
В другом смысле, объект - object, класс - class.
object - это что-то вроде record"а, который может
хранить кроме полей еще и процедуры и функции.
отличие class от object в том, что class создается
динамически.

надеюсь ничего не напутал. :)


 
Opuhshii ©   (2004-03-28 15:15) [2]

Вот смотри, бывают бутылки с пивом,
бутылки с пивом - это класс,
а вот та которую я сейчас пью есть конкретная реализация этого класса - объект.


 
Opuhshii ©   (2004-03-28 15:17) [3]

"конкретная реализация" читать как "экземпляр"


 
Kolyan ©   (2004-03-28 15:22) [4]


> Opuhshii ©   (28.03.04 15:17) [3]

По моему понял.
Например:
Библиотека - это класс. А книга по Делфи - это объект или экземпляр класса.Так что ли?


 
vuk ©   (2004-03-28 15:23) [5]

>Так что ли?
Не, не так. Класс - человек, Kolyan - экземпляр. ;o)


 
Opuhshii ©   (2004-03-28 15:30) [6]

идея не в "бутылки с пивом", а вообще "бывают бутылки с пивом"


 
Kolyan ©   (2004-03-28 15:33) [7]


> vuk ©   (28.03.04 15:23) [5]

ДА. ДА. Программеры - класс. А vuk - экземпляр. ;o)


 
vuk ©   (2004-03-28 15:40) [8]

Факт! :o)


 
ИМХО ©   (2004-03-28 17:35) [9]

Голубые - класс. Борька Моисеев - объект... или субъект :o)


 
vuk ©   (2004-03-28 18:09) [10]

Он тип.


 
ИМХО ©   (2004-03-28 18:17) [11]

Тот еще.


 
Nous Mellon ©   (2004-03-28 18:34) [12]

Неужто сложно в ФАК посмотреть.
Там тот же самый вопрос выяснял ныне замастеревший Palladin
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988619105&n=19


 
ИМХО ©   (2004-03-28 18:46) [13]

Молодца, Мауз Нейлон! Достал скелет из шкафа.


 
Nous Mellon ©   (2004-03-28 19:06) [14]


> Молодца, Мауз Нейлон! Достал скелет из шкафа.

Хоми ты чего? Такие знания не устаревают..


 
TButton ©   (2004-03-28 19:09) [15]

>Неужто сложно в ФАК посмотреть
да.


 
Nous Mellon ©   (2004-03-28 19:27) [16]


> >Неужто сложно в ФАК посмотреть
> да.

Ну тогда это ни что иное как леность и тупость человека которому это сложно


 
SergP ©   (2004-03-28 19:34) [17]

>Opuhshii ©   (28.03.04 15:15)
>бутылки с пивом - это класс,

И чем их больше - тем класснее... :-)))


 
AZ ©   (2004-03-28 21:11) [18]

Лучше, чем ЮЗ, тебе никто не объяснит.


 
Kolyan ©   (2004-03-29 06:04) [19]


> Nous Mellon ©   (28.03.04 18:34) [12]

Вот блин не увидел это в факах. Спасибо всем. Просто теперь я действительно понял чем они отличаются


 
Alex Konshin ©   (2004-03-29 07:28) [20]

Дайте и мне вставить свою копейку (цент?).

Класс - это метаданные. Он описывает как работать с объектами (экземплярами) этого класса и может еще содержать данные, которые общие для всех объектов этого класса (кстати, в Delphi это не поддерживается).

Объект же содержит указатель на класс (чтобы знать, к какому классу он принадлежит и как как с ним работать) и данные именно этого объекта.

Теперь, чтобы окончательно вас запутать :)
В некоторых языках (например, в Java, но в Delphi этого нет) класс как таковой тоже является объектом некого класса (в Java - Class), который имеет методы для работы с классами, например, можно узнать родительский класс или имя класса.

В Delphi же указатель на класс это особый тип - "class of". Реально это указатель на VMT (virtual method table) этого класса - таблице указателей на все виртуальные методы этого класса, а также некоторые другие данные (например RTTI - run-time type information).
Конструкция
var pclass : class of TObject;
описывает переменную, которой можно присвоить указатель на класс.
В модуле TypInfo есть куча функций для работы с этими указателями.

Теперь вернемся к обектам в Delphi. Физически это record, у которой в первых 4 байтах находится указатель на класс. Далее идут поля, которые описаны при определении класса (точнее, сначала поля, описанные у всех предков этого класса, а потом уже поля собственно этого класса).

Запутал? :)


 
Думкин ©   (2004-03-29 07:43) [21]

Не останавливайся, продолжай. %))


 
MeF88 ©   (2004-03-29 08:04) [22]

Блин, ну людям хелп открыть почитать влом... Дожили.


 
Alex Konshin ©   (2004-03-29 08:08) [23]

А куда уж дальше? Про RTTI вроде не спрашивали. Про структуру VMT, конечно, можно рассказать, но нужно ли?


 
Думкин ©   (2004-03-29 08:15) [24]

смайл не помог. умолкаю. :((


 
Kolyan ©   (2004-03-29 09:08) [25]


> MeF88 ©   (29.03.04 08:04) [22]
> Блин, ну людям хелп открыть почитать влом... Дожили.

Если ты это адресуешь мне и говоришь о хелпе в Делфи, то я в Английском практичеки  полный нуль.


 
wal ©   (2004-03-29 10:00) [26]

А можно я скажу?
Как НЕТ?
А я все равно скажу!
Вот ты сидишь на стуле. Стул - это объект. Стул собирали по чертежу. Чертеж - это класс. Внимание вопрос. Чем чертеж стула отличается от стула? Из чертежа можно еще один стул сделать (Стул := TСтул.Create), можно взять этот чертеж за основу, и нарисовать еще один чертеж (ТСуперСтул = class(ТСтул)). Можно, конечно и на чертеже сидеть, но как-то не удобно :) .

С уважением.


 
Reindeer Moss Eater ©   (2004-03-29 10:01) [27]

Все это хорошо.
Но в OP класс - это тоже объект.


 
Alex Konshin ©   (2004-03-29 10:05) [28]

Но в Delphi это не так.


 
Reindeer Moss Eater ©   (2004-03-29 10:12) [29]

Это так и в Делфи потому что в Delphi -  Object Pascal


 
Alex Konshin ©   (2004-03-29 10:16) [30]

Не, ты не прав. В Delphi class это отдельный тип данных, но он не является объектом. Вот в Java - да, там именно так.


 
Reindeer Moss Eater ©   (2004-03-29 10:17) [31]

Нет это ты не прав. А в Delphi класс - это тоже объект.


 
int64   (2004-03-29 10:18) [32]

Alex Konshin ©   (29.03.04 07:28) [20]

> может еще содержать данные, которые общие для всех объектов
> этого класса (кстати, в Delphi это не поддерживается).

Можно я спрашу? Почему все вспоминают, что в Delphi это не поддерживается. И какой практический смысл.
Фобия на глобальные переменные и методы класса? :|


 
Alex Konshin ©   (2004-03-29 10:46) [33]

Reindeer Moss Eater ©   (29.03.04 10:17) [31]
Нет это ты не прав. А в Delphi класс - это тоже объект.

Нет ты, нет ты! Что за детство? Аргументы есть?
Ты знаешь методы у указателей на класс? И еще более важно: ты можешь достать указатель на класс этого "объекта"?


 
Anatoly Podgoretsky ©   (2004-03-29 10:47) [34]

Что бы далее запутать, в Дельфи есть две модели -  классовая и объектовая. Например КОЛ построен по объектовой модели.


 
Alex Konshin ©   (2004-03-29 10:54) [35]

int64   (29.03.04 10:18) [32]
Потому как проще и понятнее просто объявить поле - статический член класса, чем городить конструкцию со статическими методами класса и глобальными переменными.


 
Плохиш   (2004-03-29 11:10) [36]


> int64   (29.03.04 10:18) [32]
> Потому как проще и понятнее просто объявить поле - статический
> член класса, чем городить конструкцию со статическими методами
> класса и глобальными переменными.

А можно это ещё раз по-русски и по-медленнее?


 
Alex Konshin ©   (2004-03-29 11:12) [37]

Хм, вроде и так по-русски. Ты просто читай медленнее. :)
А что именно неясно?


 
Плохиш   (2004-03-29 11:55) [38]

>Alex Konshin ©   (29.03.04 11:12) [37]
Да вроде слова все русские :-(
Может на примере продемонстрируете?


 
Igorek ©   (2004-03-29 12:01) [39]

Класс - множество, обьект - его элемент.

Теперь ответьте в таком же духе:
- что такое метакласс (class of T...)
- что такое предок класса
- что такое наследник класса
- что такое класс имеющий общий базовый с данным
- что такое TObject в ObjectPascal
- что такое два обьекта одного класса с разными значениями полей
- -..- с одинаковыми значениями полей

Если ответы будут клевые - оформим образовательную статью с философским уклоном. :-)


 
Игорь Шевченко ©   (2004-03-29 12:16) [40]


> В некоторых языках (например, в Java, но в Delphi этого
> нет) класс как таковой тоже является объектом некого класса
> (в Java - Class), который имеет методы для работы с классами,
> например, можно узнать родительский класс или имя класса.


AFAIK, в Delphi все классы являюся наследниками TObject, у которого определены методы
   class function ClassName: ShortString;
   class function ClassNameIs(const Name: string): Boolean;
   class function ClassParent: TClass;
   class function ClassInfo: Pointer;
   class function InstanceSize: Longint;
   class function InheritsFrom(AClass: TClass): Boolean;
и т.д.

Чем не аналог Class в Java ?


 
Alex Konshin ©   (2004-03-29 12:29) [41]

Игорь Шевченко ©   (29.03.04 12:16) [40]
Сурогат, а не аналог. Я не говорю, что с этим жить нельзя, но в Java это логичнее - там не изобретается новой сущности, как в Delphi. А где конструкторы классов? А где рефлексия (и не надо мне говорить про RTTI - как мы знаем, там есть далеко не все)?
И еще в Java классы - это объекты класса Class, в Delphi же - и не объекты вовсе.


 
Vuk ©   (2004-03-29 15:43) [42]

to Alex Konshin ©   (29.03.04 12:29) [41]:
>А где конструкторы классов?
Какие конструкторы и что они должны конструировать? Если будете отвечать, не забывайте, что язык другой.

>А где рефлексия?
Угу, RTTI не катит. Следующий вопрос, видимо, должен быть из серии "И почему вообще язык не Java а како-то другой?" Давайте я спрошу, например, где в Java свойства? :o)

>И еще в Java классы - это объекты класса Class, в Delphi же - и
>не объекты вовсе.
Между прочим, вполне логично, т.к. класс - это нечто стоящее над объектами, т.е. обычным объектом быть не может. Для обозначения сущностей, экземплярами которых являются классы, существует понятие метакласса. Вот как раз ссылки на класс в Delphi и являются аналогами метаклассов.


 
Kolyan ©   (2004-03-29 17:37) [43]

Дай программерам тему. :) . Я просил объяснить подробно и понятно. Сначала объяснили. Потом поперло...... Всё сложнее и сложнее, затем java приплели. Потом еще че-то, уже смотрю и рефлексии какие-то. Или у вас девиз сначала объяснить а потом запутать, чтоб человек, задавший вопрос в конце конференции ни фига не понял. Но все же спасибо. Не сочтите все слова за наезд, просто на самом деле интересно читать, так быстро у вас ход мыслей развился. Прикольные вы люди. :) . Ещё раз спасибо, вы все мне очень помогли


 
Anatoly Podgoretsky ©   (2004-03-29 17:51) [44]

Не зря старались :-)


 
DiamondShark ©   (2004-03-29 17:52) [45]

>>А где рефлексия (и не надо мне говорить про RTTI - как мы знаем, там есть далеко не все)?

А чего не хватает?

>>И еще в Java классы - это объекты класса Class, в Delphi же - и не объекты вовсе.

И что от этого страдает, кроме религиозных чувств?


 
Юрий Зотов ©   (2004-03-29 17:56) [46]

> Kolyan ©   (29.03.04 17:37) [43]

Все нормально, это просто у программеров рефлексия такая.
А ответ дан в [5] и в [7].


 
DiamondShark ©   (2004-03-29 18:07) [47]


> это просто у программеров рефлексия такая

Угу. А конструкторы классов. ;-)


 
Юрий Зотов ©   (2004-03-29 18:25) [48]

> DiamondShark ©   (29.03.04 18:07) [47]

А конструкторы как раз классов. Как и все остальные методы. Поскольку принадлежат именно классам, а не их экземплярам.
:о)


 
DiamondShark ©   (2004-03-29 19:04) [49]

Вместо А должно быть И.


 
Alex Konshin ©   (2004-03-30 04:23) [50]

DiamondShark ©   (29.03.04 17:52) [45]
И чего вы, горячие финские парни, сразу про оскорбленные религиозные чувства вспоминаете?
Я просто описал, как это выглядит в другом языке, который создан позднее и, соответственно, учтен опыт предыдущих поколений. На мой взгляд это очевидно, что в Java это сделано логичней, но я же и сказал, что и в Delphi жить можно.

Про конструкторы классов: в Java ну не совсем уж прямо конструкторы, но создать динамически новый класс с новыми методами совсем не проблема, вызвать любой метод - тем более.
Property там нет, но в C#, который создан еще позднее, это уже есть, а в остальном он ну очень похож на Java.

И давайте не воспринимать это как наезд на Delphi, а как обзор различных подходов к реализации. :)


 
Vuk ©   (2004-03-30 10:32) [51]

to Alex Konshin ©   (30.03.04 04:23) [50]:
>но в C#, который создан еще позднее, это уже есть, а в остальном
>он ну очень похож на Java
Хм... Это не в C#. Это в .net. То есть теперь и в Delphi. :o)


 
pasha_golub ©   (2004-03-30 11:34) [52]

А шо такое рефлексия? Первый раз слышу, если честно.


 
Reindeer Moss Eater ©   (2004-03-30 11:37) [53]

Буквально - самокопание.
Здесь - получение в рантайм информации о классе из самого класса


 
Alex Konshin ©   (2004-03-30 11:38) [54]

Нет, это все-таки в C#.
.NET - это VM (также, как Java VM), она сама по себе никакого отношения к языкам не имеет. Существует куча компиляторов с разных языков, которые компилируют в .NET, вспомни, из чего состоит Visual Studio.


 
Vuk ©   (2004-03-30 11:52) [55]

to Alex Konshin ©   (30.03.04 11:38) [54]:
>Нет, это все-таки в C#.
Таки в .net, а не в C#. Это внутренние особенности CLR. А C# - один из языков, которые эти возможности используют.

>Существует куча компиляторов с разных языков, которые
>компилируют в .NET, вспомни, из чего состоит Visual Studio.
Я помню, но дела это не меняет.


 
DiamondShark ©   (2004-03-30 11:56) [56]


> Alex Konshin ©   (30.03.04 04:23) [50]
> Про конструкторы классов: в Java ну не совсем уж прямо конструкторы,
> но создать динамически новый класс с новыми методами совсем
> не проблема, вызвать любой метод - тем более.

?!?!
Не видел жаву вблизи. Это что ж получается, можно самомодифицирующиеся программы писать? Уй-ё... Бедная среда исполнения. А иллюстрацию в коде можно?


 
Alex Konshin ©   (2004-03-30 12:03) [57]

DiamondShark ©   (30.03.04 11:56) [56]
Почему самомодифицирующиеся? Создал новый класс и добавил к нему методы, потом создал объекты этого класса. Где же самомодифицирующийся код?
Хотя, теоретически, ты имеешь возможность создать в памяти байткод и создать метод с этим байткодом.


 
Alex Konshin ©   (2004-03-30 12:10) [58]

Vuk ©   (30.03.04 11:52) [55] То, что в VM есть поддержка специфических особенностей каких-то языков, не значит, что все поддерживаемые языки автоматически будут использовать эту фичу. Например, можно написать компилятор с Java под .NET (я кстати, слышал про такие проекты, не знаю только, чем там дело кончилось), от этого в Java не появятся property. Кстати, есть компилятор Pascal под .NET, я даже знаю, кто его писал для MS.
Я его не смотрел, но я не удивлюсь, если там никакими property и не пахнет.


 
Vuk ©   (2004-03-30 12:18) [59]

to lex Konshin ©   (30.03.04 12:10) [58]:
>от этого в Java не появятся property
Правильно. Компилятор с языка реализует нужные ему возможности на основе CLR, но это не значит, что все, что доступно в CLR становится автоматически доступным в языке. Например в CLR есть именованные параметризованные свойства, в C# их нет, а в D8 Есть.


 
DiamondShark ©   (2004-03-30 12:24) [60]


> Alex Konshin ©   (30.03.04 12:03) [57]

Вот со слов "добавил методы", пожалуйста, подробнее.
Откуда методы возьмутся?


 
Alex Konshin ©   (2004-03-30 12:42) [61]

Давай я тебе более-менее реальный пример приведу, зачем это бывает нужно и ты тогда поймешь, как это писать?

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

Это одно из возможных применений этой технологии, может и несколько надуманое, но, надеюсь, ты понял как это может быть сделано.



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

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

Наверх




Память: 0.63 MB
Время: 0.024 c
3-1080194959
denmin
2004-03-25 09:09
2004.04.25
Проблема с ADOTable.


7-1074700004
Evg12
2004-01-21 18:46
2004.04.25
HDD s/n


3-1080310297
ЁПРСТ
2004-03-26 17:11
2004.04.25
При закрытии ADO Query без закрытия ADOConnection идет ругань


14-1081233338
Думкин
2004-04-06 10:35
2004.04.25
С днем рождения! 6 апреля.


1-1081618730
Анатолий Ксюндзский
2004-04-10 21:38
2004.04.25
TNotifyEvent