Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.61 MB
Время: 0.033 c
3-1080204702
Vano
2004-03-25 11:51
2004.04.25
В DbGrid-е не отоброжается содержание memo поля


4-1077304401
KADAN
2004-02-20 22:13
2004.04.25
Работа со звуком


3-1080272370
nik7777
2004-03-26 06:39
2004.04.25
Отловить одинаковые данные в БД


7-1078081303
Digital man 53
2004-02-29 22:01
2004.04.25
Тип REG_MULTI_SZ в реестре средствами дельфи


3-1080548815
gedd
2004-03-29 12:26
2004.04.25
Поле "Счетчик" в MS SQL Server 2000.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский