LINUX.ORG.RU

Вопросы по ООП

 ,


0

1

Привет,

у меня накопилось несколько вопросов, касающихся ООП. Предлагаю их здесь обсудить. В качестве языка я рассматриваю java.

1) абстрактный тип данных = интерфейс

структура данных = класс

класс состоит из интерфейса (внутреннего и / или внешнего) и его частичной / полной реализации

2) объект - класс в runtime?

3) почему в позднем связывании определение типа вызывающего метода обязательно рассматривается в контексте runtime? Что такое runtime?

интерфейс - контракт

класс - тип

subwoofer ★★★★★ ()
Ответ на: комментарий от subwoofer

правила для взаимодействия с данной сущностью (контракт).

т.е. контракт - множество всех наследуемых и добавленных методов класса? Контракт - реализация интерфейса класса?

misanthropy ()

объект - класс в runtime

Объект - это экземпляр класса.

почему в позднем связывании определение типа вызывающего метода обязательно рассматривается в контексте runtime?

Полиморфизм.

Что такое runtime?

Кэп намекает, что это время выполнения программы. Когда говорят, что «X определяется в runtime», то имеют ввиду, что X определяется во время выполнения программы.

В общем случае, интерфейс - это взятые обязательства. В Java, это набор сигнатур методов, которые должны быть реализованы внутри класса, реализующего интерфейс.

robus ★★★★ ()

объект - класс в runtime?

Нет

почему в позднем связывании определение типа вызывающего метода обязательно рассматривается в контексте runtime?

Потому что позднее связывание на этапе компиляции не возможно.

Что такое runtime?

Момент времени после запуска программы и до её остановки.

ya-betmen ★★★★★ ()

Абстрактные классы в джаве реализованы отдельно от интерфейсов.
Объект — экземпляр класса. Сконструированный.
Позднее связывание — по определению рантаймовое. При раннем связывании (на этапе компиляции) нам известно, какие методы вызовутся конкретно. А если у тебя есть, к примеру, коллекция объектов класса A, а в реальности там лежат всякие наследники A, то они могли переопределить метод. Следственно, на этапе компиляции нельзя знать, какой именно метод для элемента коллекции будет вызван. Тут нужно позднее связывание. По сути, в джаве всё связывание — позднее, ибо все методы виртуальны.

evilface ★★ ()
Ответ на: комментарий от evilface

Кроме статичных, но они вызываются от имени класса. Вызывать их от экземпляра не очень хорошо, вносит путаницу, а полиморфизм для них не работает. Можно сделать не то, что хотел.

evilface ★★ ()
Ответ на: комментарий от evilface

Следственно, на этапе компиляции нельзя знать, какой именно метод для элемента коллекции будет вызван.

Почему? Компилятор же видит, что reference ссылке присвоена ссылка на объект подтипа этой reference ссылки?

misanthropy ()
Ответ на: комментарий от misanthropy

Коллекция животных. От класса животных наследуются кошки и собаки.
Считываем от пользователя, кого добавить.
Кладём в коллекцию кошку или собаку, кого ввели.
Вызываем метод голос()
Что мы слышим, «гав» или «мяу»?

evilface ★★ ()
Ответ на: комментарий от evilface

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

Позднее связывание есть только в smalltalk-like языках

portquest2016 ()
Ответ на: комментарий от portquest2016

Позднее связывание — ничто иное, как выбор вызываемого метода на этапе выполнения программы. Что не так?

evilface ★★ ()
Ответ на: комментарий от evilface

Вот так должно быть:


Animal := Object clone

Duck := Animal clone do(
  voice := method("cra-cra" println)
)

Cat := Animal clone do(
  voice := method("meow" println)
)

donald := Duck clone
vasya := Cat clone

Animal action := method(voice)

donald action
vasya action


Duck go := method("shmack-shmack" println)
Cat go := method("shap-shap" println)
Animal action := method(go)

donald action
vasya action



#>>>> cra-cra
#>>>> meow
#>>>> shmack-shmack
#>>>> shap-shap

portquest2016 ()
Ответ на: комментарий от evilface

Не только выбор, но и переопроделение/добавление/удаление в любой объект/класс/суперкласс, без предварительной декларации. И не только методов, любых полей

portquest2016 ()
Ответ на: комментарий от misanthropy

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

portquest2016 ()
Ответ на: комментарий от misanthropy

рефлексия

Не слушай этого господина. Рефлексия - это исследование программой своей структуры в процессе работы, например определение какие у объекта есть методы, какие параметры имеют эти методы, кто родитель объекта, кто вызвал текущую функцию и т.п. Причём такое исследование должно проводится явно, а не как при позднем связывании, когда рантайм языка всё делает за кулисами и программа никак в этом участия не принимает.

Термин вообще пришёл из философии где он означает самоосмысление, дословно - «отражение» себя в своих мыслях.

no-such-file ★★★★★ ()
Последнее исправление: no-such-file (всего исправлений: 1)

Откуда-то не оттуда ты начал программирование учить.

anonymous ()

Класс это образно говоря чертёж детали. Объект это сделанная деталь. Причём делаются эти «детали» в runtime. Структура данных. Это способ хранения и организации каких то твоих данных в коде. Допустим создал ты сто объектов какого то класса. Их надо как то удобно хранить. Вот тут тебе надо выбрать либо стандартную(библиотечную) структуру данных. Либо изобретать её самому.

khenty ()
Ответ на: комментарий от misanthropy

Как можно писать в ООП стиле, не зная его определение?

Легко. Вы спросите знакомых программистов что такое компьютер. Они растеряются. Но пользоваться им от этого не перестанут.

khenty ()

Подскажите, где я не прав:

* абстрактный тип данных -> структура данных (интерфейс, класс, перечисление) -> инкапсуляция

* класс = внутренний и / или внешний интерфейс + его реализация

* наследование - копирование интерфейса и реализации одной стр. данных другой структурой данных

* ad-hoc / parametric / subtype полиморфизм -> просто синтаксический сахар, не связанный, наверно, с поздним связыванием

* позднее связывание - не относится к ООП, т.к. определяется (?) возможностью выбора метода в runtime, в зависимости от внешних к программе данных. Его, наверно, можно реализовать даже в с.

misanthropy ()
Ответ на: комментарий от khenty

Легко. Вы спросите знакомых программистов что такое компьютер. Они растеряются. Но пользоваться им от этого не перестанут.

растеряются, но расплывчатое определение дать смогут, - представление о нём есть.

Но это всё демагогия, да.

misanthropy ()
Ответ на: комментарий от portquest2016

Не только выбор, но и переопроделение/добавление/удаление в любой объект/класс/суперкласс, без предварительной декларации. И не только методов, любых полей

Java Reflection API позволяет всё это.

evilface ★★ ()
Последнее исправление: evilface (всего исправлений: 1)
Ответ на: комментарий от no-such-file

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

portquest2016 ()
Ответ на: комментарий от misanthropy

reflection ⊃ introspection

философия ⊃ computer science. Ещё раз для тупых - рефлексия это отражение программой своей структуры. Как конкретно и в каких количествах это происходит (или возможно) - дело десятое.

which goes a step further and is the ability for a program to manipulate the values, meta-data, properties and/or functions of an object at runtime

Нет там никакого step further, просто возможности языка и его терминология. Все эти размышления про step further это просто маркетинговый булшит, который был призван показывать, что у нас не как у них. Обычное такое сегментирование рынка - наш йогурт полезнее чем их, потому что это БИО йогурт! У нас «рефлексия» ололо новое слово в технике. На самом деле важно то, допускает ли язык ковыряние в потрохах класса или нет. Очевидно, что имея такую фичу, можно по полученным данным состряпать объект на коленке, или вызывать методы по имени - это как бы само собой разумеется.

Some programming languages - e.g. Java, Python and Go

Реклама такая реклама. Просто ржу. Назови мне хоть один язык который поддерживает «интроспекцию» без «рефлексии».

no-such-file ★★★★★ ()
Ответ на: комментарий от misanthropy

Абстрактный тип данных это заготовка(или эскиз) для конкретных классов. Наследуясь от такого типа (в С++) разработчик обязан реализовать набор методов работы с объектом(классом) которые объявлены, но скорее всего не реализованы в абстрактном типе. Такая «заготовка» может быть и для различных структур данных, всякие списки, стеки, деревья и т.п. Но абстрактный тип данных может быть «заготовкой» и для любых других классов.

ИМХО: Займись процедурщиной, а не летанием в облаках ООП. Со временем постепенно придёт и понимание ООП.

khenty ()
Ответ на: комментарий от robus

В общем случае, интерфейс - это взятые обязательства. В Java, это набор сигнатур методов, которые должны быть реализованы внутри класса, реализующего интерфейс.

Это лишь часть интерфейса, которую в состоянии проверить компилятор. Вообще говоря, помимо сигнатур методов это ещё и подразумеваемые требования к их реализации — например, интерфейс Cloneable (да, в Sun не знают английский) не содержит ни одного метода, но реализуя этот интерфейс, программист утверждает, что clone() делает что-то разумное, в соответствии с его контрактом.

Softwayer ★★ ()
Ответ на: комментарий от portquest2016

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

А так и есть. Вызов замыкания - полностью эквивалентен вызову виртуального метода.

anonymous ()
Ответ на: комментарий от Softwayer

Это лишь часть интерфейса, которую в состоянии проверить компилятор. Вообще говоря, помимо сигнатур методов это ещё и подразумеваемые требования к их реализации

Спасибо, буду знать.

robus ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.