Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/84: Рейтинг темы: голосов - 84, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 02.10.2019
Сообщений: 20

Объясните понятие ООП

13.02.2020, 23:25. Показов 22964. Ответов 242

Студворк — интернет-сервис помощи студентам
Скажите пожалуйста понятным языком, что такое объектно-ориентированное программирование ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.02.2020, 23:25
Ответы с готовыми решениями:

Понятие ООП
Доброго времени суток! Пытаюсь вникнуть в ООП после длительного написания кода в процедурном стиле, и это не так просто =( Хочу...

Объясните понятие изоморфизма двух алгебр (на примере)
Кто нибудь, объясните мне понятие изоморфизма двух алгебр на примере. Или дайте источник информации (я искал -- толкового ничего не нашёл)....

Дать понятие понятие НОК в кольце целых чисел
Дать понятие понятие НОК в кольце целых чисел.

242
Модератор
Эксперт функциональных языков программирования
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
26.10.2020, 12:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Отсюда цитата:
https://medium.com/devschacht/... 07d9f9cd78
Кстати, неплохая статья про полиморфизм. Если Вы её читали, то странно слышать от Вас рассуждения типа:
"Полиморфизм... Эта интересная штука выплывает из-за того, что имя функции не является полным идентификатором (в паскалевском смысле). "
0
821 / 580 / 75
Регистрация: 20.09.2014
Сообщений: 3,827
28.10.2020, 07:55
Цитата Сообщение от Shamil1 Посмотреть сообщение
я всегда могу передать в функцию экземпляр класса наследника вместо экземпляра базового класса.
А как иначе-то? Вы при наследовании стерли имя/тип родителя... И что делать всем полям и методам без того имени? Напрашивается ответ: использовать имя/тип объекта-наследника.
А при композиции так как за методами и полями осталось старое имя, то и делать ничего не надо.
Цитата Сообщение от Shamil1 Посмотреть сообщение
Кстати, неплохая статья про полиморфизм. Если Вы её читали, то странно слышать от Вас рассуждения типа
Я ее читал. Просто у людей возникает желание расширить понятие полиморфизма до бесконечности, включая туда тривиальные вещи типа когда ты сам пишешь функцию, которая как-то перестраивается в зависимости от входных данных (параметрический полиморфизм). Этот случай - полная лажа. Любая функция меняет свое поведение в зависимости от входных данных.
Для студентов такое обобщение полезно. Чтобы не забывали. А адептам языков программирования надо думать только о том, что выражается на языке программирования программными конструкциями, а не подразумевается.
0
Модератор
Эксперт функциональных языков программирования
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
28.10.2020, 09:34
Цитата Сообщение от Mikhaylo Посмотреть сообщение
типа когда ты сам пишешь функцию, которая как-то перестраивается в зависимости от входных данных (параметрический полиморфизм)
Вы неправильно поняли, что такое параметрический полиморфизм. Не "меняет свое поведение в зависимости от входных данных", а "один и тот же код выполняется для разных типов".

Цитата Сообщение от Mikhaylo Посмотреть сообщение
А при композиции
Если я создам новый тип с помощью наследования, то я смогу везде использовать его вместо старого. В этом смысл ООП.
Если я создам новый тип с помощью композиции, то я не смогу использовать его вместо старого.
0
 Аватар для vantfiles
1018 / 1921 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
28.10.2020, 15:31
Цитата Сообщение от Shamil1 Посмотреть сообщение
Если я создам новый тип с помощью композиции, то я не смогу использовать его вместо старого.
Я - смогу.
0
Модератор
Эксперт функциональных языков программирования
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
28.10.2020, 19:57
Цитата Сообщение от vantfiles Посмотреть сообщение
Я - смогу.
Без утиной типизации?
0
 Аватар для vantfiles
1018 / 1921 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
29.10.2020, 11:20
Не уверен, что это именно утиная типизация:

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
point_1d = class()
  function point_1d:_init( x )
    self.x = x
  end
  point_1d:move = function( dx ) x = x + dx end
 
point_2d = class()
  function point_2d:_init( x, y )
    self.x = x
    self.y = y
  end
  point_2d:move = function( dx, dy ) x = x + dx y = y + dy end
 
point_3d = class()
  function point_3d:_init( x, y, z )
    self.x = x
    self.y = y
    self.z = z
  end
  point_3d:move = function( dx, dy, dz ) x = x + dx y = y + dy z = z + dz end
 
-- используем:
 
p1 = point_1d( 1 )
p2 = point_2d( 2, 3 )
p3 = point_3d( 4, 5, 6 )
 
points = { p1, p2, p3 }
 
for i = 1, #points do
    points[ i ]:move( 1, 2, 3 ) -- передвигаем каждую из точек по тем координатам, на которые они способны
end
Я не стал здесь заморачиваться с композицией, главное, что классы не наследуются.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
29.10.2020, 14:10
Цитата Сообщение от vantfiles Посмотреть сообщение
Не уверен, что это именно утиная типизация:
Это утиная типизация. )
0
 Аватар для vantfiles
1018 / 1921 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
29.10.2020, 14:34
Цитата Сообщение от korvin_ Посмотреть сообщение
Это утиная типизация. )
разница в количестве аргументов не смущает?
0
Модератор
Эксперт функциональных языков программирования
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
29.10.2020, 16:24
Цитата Сообщение от vantfiles Посмотреть сообщение
разница в количестве аргументов не смущает?
Утиная типизация - когда у объекта совершенно случайно находится подходящий метод. Случайно - значит никто не обещал, что он найдётся. Разница в количестве аргументов - показатель заниженных требований транслятора к слову "подходящий". Это как в JavaScript - можно вызвать любую функцию с любым количеством аргументов любого типа... достаточно, чтобы имя совпадало.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
29.10.2020, 16:38
Цитата Сообщение от vantfiles Посмотреть сообщение
разница в количестве аргументов не смущает?
Не особо, типичная вещь для многих динамически-типизированных языков.
0
 Аватар для vantfiles
1018 / 1921 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
29.10.2020, 18:10
Цитата Сообщение от Shamil1 Посмотреть сообщение
совершенно случайно находится подходящий метод. Случайно - значит никто не обещал, что он найдётся.
Я обещаю, чесслово совпадут. Клянусь своей треуголкой.
0
Модератор
Эксперт функциональных языков программирования
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
30.10.2020, 12:24
vantfiles,
Упрощённо:

Полиморфизм - функция может обрабатывать аргументы разных типов.

Утиная типизация - тип определяется по поведению (умеет крякать - значит утка).
Фактически, функция может обрабатывать только один тип "утка", но относит к нему всех, кто умеет крякать. Это не полиморфизм.

Специальный (ad hoc) полиморфизм - это не настоящий полиморфизм, а всего лишь иллюзия полиморфизма.
Каждая из функций работает только с одним конкретным типом, но из-за одинаковых имён у разных функций и/или неявного приведения к нужному типу, создаётся иллюзия, что одна функция работает с разными типами.
Имеем две разновидности специального полиморфизма - перегрузка и неявное приведение.

Истинный (универсальный) полиморфизм - функция может обрабатывать аргументы разных типов. Но не любых, а удовлетворяющих неким условиям, выполнение которых гарантирует, что функция умеет обрабатывать данные типы.
Имеем две разновидности универсального полиморфизма - парметрический и включения (подтипов).

Полиморфизм подтипов - функция работает с типом Т и всеми его наследниками. Гарантируется, что наследники умеют всё то, что умеет базовый класс.

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

В ООП "классы типов" можно имитировать с помощью наследования от интерефейсов. У такого подхода есть два существенных недостатка:
1. Если для входных параметров работает полиморфизм подтипов, то возвращаемый результат нужно приводить к нужному типу. Для решения этой проблемы в современные ООЯ добавляют обобщённые функции (параметрический полиморфизм).
2. Наследование нельзя задать без изменения исходного кода, описывающего тип. (Например, я не могу добавить в тип List<T> наследование от своего интерфейса). Для решения этой проблемы в современные ООЯ добавляют миксины (классы типов).
1
 Аватар для vantfiles
1018 / 1921 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
30.10.2020, 16:47
Это тоже утки?

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
thing_01 = class()
  thing_01:do_it = function() print( "do_it" ) end
 
thing_02 = class()
  thing_02:just_do_it = function() print( "just_do_it" ) end
 
thing_03 = class()
  thing_03:do_samething = function() print( "do_samething" ) end
 
-- используем:
 
p1 = thing_01()
p2 = thing_02()
p3 = thing_03()
 
things = { p1, p2, p3 }
 
for i = 1, #things do
    for k,v in pairs( things[ i ] ) do
        if type( v ) == "function" then -- умеешь хоть что-то делать?
           v() -- делай это!
        end
    end
end
Есть еще вариант через метаданные и через алиасы, если интересно, приведу и их.
0
821 / 580 / 75
Регистрация: 20.09.2014
Сообщений: 3,827
30.10.2020, 19:54
Настоящий полиморфизм - это не то, что вы называете настоящим полиморфизмом, просто потому что так хочется. Настоящий полиморфизм - его отличает то, что он специально поддерживается языком программирования.
Отсюда, поддержка языком динамических типов и наличие функции type_of() - это хрень, а не полиморфизм.
Настоящий полиморфизм - это перегрузка функции, так как язык поддерживает несколько морфов одной функции.
Полиморфизм - это только "поли" (много) и "морф" (форма) в языке.

Добавлено через 3 минуты
Короче наш предмет спора заключается в следующем:
1. Ваша школа учит давать определения в отрыве от конкретного языка (у вас концепции).
2. У меня определения конкретные, основаны на языковых конкретиках.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
31.10.2020, 02:30
Цитата Сообщение от vantfiles Посмотреть сообщение
Это тоже утки?
Нет, это простое использование рефлексии.
0
Модератор
Эксперт функциональных языков программирования
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
02.11.2020, 13:31
В разделе ИИ я уже насмотрелся на деятелей типа "Вы все не понимаете, что такое ИИ, и в учебниках всё неправильно написано. Сейчас я вам объясню, что такое ИИ на самом деле." с последующим объяснением в стиле "Иван и Марфа..".
0
821 / 580 / 75
Регистрация: 20.09.2014
Сообщений: 3,827
02.11.2020, 18:42
Да просто по вашим шпаргалкам перегрузку функций надо относить к универсальному полиморфизму, но вы не задумываясь на автомате относите ее к специальному полиморфизму. Ведь по определению, универсальный полиморфизм поддерживает сколько угодно разных типов. А перегрузка как раз поддерживает сколько угодно типов. Как быть?

Получается просто нескладуха в учебниках.
0
Модератор
Эксперт функциональных языков программирования
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
02.11.2020, 23:17
Цитата Сообщение от Mikhaylo Посмотреть сообщение
А перегрузка как раз поддерживает сколько угодно типов. Как быть?
Перегрузка: Каждая функция работает с одним конкретным типом. Универсальных функций нет. Для каждого типа нужно писать свой код. Поэтому это не универсальный полиморфизм.
0
821 / 580 / 75
Регистрация: 20.09.2014
Сообщений: 3,827
03.11.2020, 18:29
Я не понимаю, почему такое цепляние за "один и тот же код обрабатывает разные данные"? Просто личная хотелка. Не так ли?
Полиморфизм ведь заключается только лишь в том, что функция с одним и тем же именем обрабатывает разные данные. Не путайте "один и тот же код" с "функцией с одним и тем же именем". Первое вообще нисколько не принципиально, не для этого морфизм придумывали. ))))

Добавлено через 3 минуты
Вот пример полиморфизма - функция strike(), которая моделирует столкновение шариков друг с другом, либо столкновение шариков с подпружиненной поверхностью, потом столкновение шариков с песком и т.д. Кому тут дался ваш универсальный полиморфизм?
0
Модератор
Эксперт функциональных языков программирования
3142 / 2290 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
04.11.2020, 02:13
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Полиморфизм ведь заключается только лишь в том, что функция с одним и тем же именем обрабатывает разные данные.
Это Ваше мнение. И оно не совпадает с общепринятым.

Я могу написать на C# функцию, которая принимает object, вызывает GetType() и дальше большой switch по результатам. Но это не будет полиморфизмом.

Цитата Сообщение от Mikhaylo Посмотреть сообщение
почему такое цепляние за "один и тот же код обрабатывает разные данные"
Потому что это основное достоинство универсального полиморфизма - написал код один раз и используешь его с разными типами (включая те, о существовании которых ты даже не знал на момент написания).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.11.2020, 02:13

Объясните кое что по ООП
Не дает мне покоя очень важный момент, пример: System.IO.File.Open() System.IO - пространство имен File - класс Open() -...

ООП в паскале. Объясните что к чему
Проблема в следующем, хотелось бы понять как подключать дополнительные файлы исходных текстов к основному. не через uses же это делается...

Объясните некоторые принципы ООП в конкретной реализации
Доброго дня! У меня есть пользователи, которые делятся на зарегистрированных (User) и незарегистрированных (Person) и создаются...

Наследование ООП, объясните примитивную ситуацию, пож
Добрый. Всё никак не могу взять в толк: как это должно работать (точнее - почему не работает так, как я ожидаю). Примитивная наколенка: ...

Начинаю изучать ООП. Объясните, что такое интерфейс?
Всем привет. Начинаю изучать ООП. Объясните,что такое интерфейс?для чего он нужен и чем он отличается от класса?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
240
Ответ Создать тему
Новые блоги и статьи
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru