Не совсем уверен, что вопрос по адресу, но тем не менее..
У нас в коллективе есть два мнения по поводу того, что такое объект.
1) объект — это экземпляр класса.
2) объект — это термин из ООП, обозначающий некоторую абстрактную сущность. В конкретных языках программирования, поддерживающих парадигму ООП, объект может быть представлен такими конструкциями языка, как class, struct и т.д. При этом есть такое понятие как экземпляр объекта. Это тоже самое, что и, например, экземпляр класса.
Подскажите пожалуйста, как правильно?
Спасибо.
10.10.07 14:05: Перенесено модератором из '.NET' — AndrewVK
Сильно зависит от контекста, то есть языка программирования. Скажем, в строго типизированном языке объект действительно стоит рассматривать как экземпляр класса. А вот в каком-нибудь скрипте объект — это просто совокупность некоторых данных и методов их обработки безо всякой жёсткой привязки с конкретным типам. В строго типизированных языках объект, вообще говоря, тоже совокупность некоторых данных и методов их обработки, но там не бывает уникальных по структуре объектов, можно создавать только объекты со структурой соответствующей некоторому шаблону — классу. С другой стороны подобное обобщение "объект — совокупность некоторых данных и методов их обработки" в контексте строго типизированных языков не даёт никаких видимых преимуществ, зато сильно всё усложняет. Вводить подобное обощение в контексте строго типизированных языков больше похоже на выпендрёж, чем на поиски правды.
Здравствуйте, Щербатов Евгений, Вы писали:
ЩЕ>1) объект — это экземпляр класса.
ЩЕ>2) объект — это термин из ООП, обозначающий некоторую абстрактную сущность. В конкретных языках программирования, поддерживающих парадигму ООП, объект может быть представлен такими конструкциями языка, как class, struct и т.д. При этом есть такое понятие как экземпляр объекта. Это тоже самое, что и, например, экземпляр класса.
ЩЕ>Подскажите пожалуйста, как правильно?
Оба мнения неправильны.
1. Объект вовсе не обязан быть экземпляром какого-то класса. Классы, вообще говоря, вторичны по отношению к объектам.
2. Конструкциями class, struct и т.д. представляются классы, а не объекты. Понятия "экземпляр объекта" не существует.
Объект — это некоторая абстрактная сущность, которая обладает
1. Идентифицируемостью. Т.е. всегда можно отличить два разных объекта друг от друга, даже если они находятся в одинаковом состоянии. Также и наоборот — можно понять, что две ссылки указывают на один и тот же объект. Идентифицируемость сохраняется в течение всего времени жизни объекта, так что, к примеру, если две ссылки когда-то указывали на разные объекты, то (без присваивания) они останутся различными.
2. Поведением. Поведением объекта называется его реакция на внешние сообщения. В современных традиционных языках программирования посылка сообщения объекту реализована как вызов метода.
3. Состоянием. Состояние детерминистического объекта полностью определяется историей сообщений, посланных ему в течение жизни. Наличие состояния позволяет одному и тому же объекту по-разному реагировать на одни и те же сообщения. Обычно подразумевается, что снаружи объекта прямого доступа к состоянию нет, и судить о состоянии можно только при помощи посылки сообщений и проверки реакции на них.
Всё. Ничего больше, вообще говоря, не надо.
Классы в ООП вводятся как множества объектов, обладающих сходным поведением.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, adontz, Вы писали:
>Вводить подобное обощение в контексте строго типизированных языков больше похоже на выпендрёж, чем на поиски правды.
Тут речь вовсе не о выпендреже. Этот вопрос поднялся в связи с вычиткой документации, которую делают наши технические писатели. Конкретно сейчас создаются документы, описывающие концепции многих подсистем и там нужно использовать правильную терминологию, причем везде единую. Вот поэтому и интересуюсь — хотелось бы писать технически грамотные документы.
Здравствуйте, Sinclair, Вы писали:
A>>Разве это объязательное условие? S>Да.
Тогда получается System.String не объект, так как не соответствует "всегда можно отличить два разных объекта друг от друга, даже если они находятся в одинаковом состоянии.", если конечно не рассматривать как состояние адрес в памяти.
Здравствуйте, adontz, Вы писали: A>Тогда получается System.String не объект, так как не соответствует "всегда можно отличить два разных объекта друг от друга, даже если они находятся в одинаковом состоянии.",
Moжно. См. Тж. ReferenceEquals(). A> если конечно не рассматривать как состояние адрес в памяти.
Ты что-то с чем-то путаешь.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, adontz, Вы писали: A>>Тогда получается System.String не объект, так как не соответствует "всегда можно отличить два разных объекта друг от друга, даже если они находятся в одинаковом состоянии.", S>Moжно. См. Тж. ReferenceEquals().
Ну а не было бы этого метода, тогда что? Я не придираюсь, просто пытаюсь понять.
Здравствуйте, Щербатов Евгений, Вы писали:
... ЩЕ>Спасибо.
Можно еще так: объект определяет область допустимых значений и набор допустимых операций, на самом деле это вообще неточное определение понятия "тип данных", но в общем случае объект и есть абстрактный тип данных.
Здравствуйте, adontz, Вы писали:
A>>>Разве это объязательное условие? S>>Да.
A>Тогда получается System.String не объект, так как не соответствует "всегда можно отличить два разных объекта друг от друга, даже если они находятся в одинаковом состоянии.", если конечно не рассматривать как состояние адрес в памяти.
А кто сказал, что идентичность определяется реализацией метода Equals()? Так определяется равенство объектов. "Объект" к адресу в памяти даже отношения не имеет: это… [может, неверно назову] логическое понятие.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, adontz, Вы писали:
A>>>>Разве это объязательное условие? S>>>Да.
A>>Тогда получается System.String не объект, так как не соответствует "всегда можно отличить два разных объекта друг от друга, даже если они находятся в одинаковом состоянии.", если конечно не рассматривать как состояние адрес в памяти.
_FR>А кто сказал, что идентичность определяется реализацией метода Equals()? Так определяется равенство объектов. "Объект" к адресу в памяти даже отношения не имеет: это… [может, неверно назову] логическое понятие.
Ну да, то есть если исключить операцию Object.ReferenceEquals две одинаковые строки в разных объектах нельзя будет различить. Это-то меня и напрягает.
Здравствуйте, adontz, Вы писали:
A>Ну да, то есть если исключить операцию Object.ReferenceEquals две одинаковые строки в разных объектах нельзя будет различить.
+1
A>Это-то меня и напрягает.
Да ладно… языкам, как и платформам, программирования всё ещё довольно далеко до того, что бы естественно описывать реальный мир
... << RSDN@Home 1.2.0 alpha rev. 717>>
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, adontz, Вы писали: A>Ну а не было бы этого метода, тогда что? Я не придираюсь, просто пытаюсь понять.
Был бы. Достаточно сделать апкаст к обжекту и провести сравнение.
Заранее хочу отказаться от необходимости комментировать все разнообразные хаки, которые присутствуют в любом промышленном языке программирования.
Если у вас есть возможность провести хак — добро пожаловать за пределы математически строгого ООП. Ничего в этом катастрофического нет.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, ryf, Вы писали: ryf>Можно еще так: объект определяет область допустимых значений и набор допустимых операций, на самом деле это вообще неточное определение понятия "тип данных", но в общем случае объект и есть абстрактный тип данных.
Не совсем. Объекты и ATD — совершенно ортогональные вещи.
В частности, объект совершенно не обязан определять область "допустимых значений", а ATD не обязан обладать идентифицируемостью.
Как правило, наоборот — два экземпляра ATD считаются неразличимыми, если у них одинаковое состояние. Операции над ATD, как правило, не изменяют состояние существующего экземпляра, а возвращают "новый".
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, adontz, Вы писали: A>Тогда получается System.String не объект, так как не соответствует "всегда можно отличить два разных объекта друг от друга, даже если они находятся в одинаковом состоянии.", если конечно не рассматривать как состояние адрес в памяти.
Вообще, у System.String намеренно реализована т.н. value-type семантика. Т.е приложены все усилия, чтобы
а) две строки в одинаковом состоянии были неразличимы
б) состояние строки не менялось в течение всей ее жизни
в) вместо изменения состояния посылкой сообщений, реализован набор примитивов по порождению новой строки из существующей.
Это ничему не противоречит, т.к. по замыслу создателей строка и не должна вести себя как объект.
Классически-ООПшное поведение строки мешает разработчикам.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Это ничему не противоречит, т.к. по замыслу создателей строка и не должна вести себя как объект. S>Классически-ООПшное поведение строки мешает разработчикам.
Меня озадачило. что пункты 2 и 3 твоего определения попахивают академическими знаниями и сгодились бы для книжки по теории ООП, а пункт 1 чисто практический и у тебя начинаются хаки, value-type семантика и т.д.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, ryf, Вы писали: ryf>>Можно еще так: объект определяет область допустимых значений и набор допустимых операций, на самом деле это вообще неточное определение понятия "тип данных", но в общем случае объект и есть абстрактный тип данных. S>Не совсем. Объекты и ATD — совершенно ортогональные вещи. S>...
согласен АТД — это просто сам класс в данном случае.
Здравствуйте, adontz, Вы писали: A>Меня озадачило. что пункты 2 и 3 твоего определения попахивают академическими знаниями и сгодились бы для книжки по теории ООП, а пункт 1 чисто практический и у тебя начинаются хаки, value-type семантика и т.д.
Пункт один — вполне себе теоретический. Теория не указывает никаких конкретных названий методов. Просто, как факт, принимается то, что ссылки на различные объекты различны. В реальной жизни эта теория проявляется различными практическими способами. К которым ты и не замедлил перейти.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Что такое объект?
От:
Аноним
Дата:
10.10.07 09:13
Оценка:
Здравствуйте, Sinclair, Вы писали:
[]
И можно узнать, кто этот теоретик, которого ты цитируешь?