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

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

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

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

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

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

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

242
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
26.10.2020, 12:34
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Отсюда цитата:
https://medium.com/devschacht/... 07d9f9cd78
Кстати, неплохая статья про полиморфизм. Если Вы её читали, то странно слышать от Вас рассуждения типа:
"Полиморфизм... Эта интересная штука выплывает из-за того, что имя функции не является полным идентификатором (в паскалевском смысле). "
0
819 / 578 / 75
Регистрация: 20.09.2014
Сообщений: 3,779
28.10.2020, 07:55
Цитата Сообщение от Shamil1 Посмотреть сообщение
я всегда могу передать в функцию экземпляр класса наследника вместо экземпляра базового класса.
А как иначе-то? Вы при наследовании стерли имя/тип родителя... И что делать всем полям и методам без того имени? Напрашивается ответ: использовать имя/тип объекта-наследника.
А при композиции так как за методами и полями осталось старое имя, то и делать ничего не надо.
Цитата Сообщение от Shamil1 Посмотреть сообщение
Кстати, неплохая статья про полиморфизм. Если Вы её читали, то странно слышать от Вас рассуждения типа
Я ее читал. Просто у людей возникает желание расширить понятие полиморфизма до бесконечности, включая туда тривиальные вещи типа когда ты сам пишешь функцию, которая как-то перестраивается в зависимости от входных данных (параметрический полиморфизм). Этот случай - полная лажа. Любая функция меняет свое поведение в зависимости от входных данных.
Для студентов такое обобщение полезно. Чтобы не забывали. А адептам языков программирования надо думать только о том, что выражается на языке программирования программными конструкциями, а не подразумевается.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
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
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
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,781
29.10.2020, 14:10
Цитата Сообщение от vantfiles Посмотреть сообщение
Не уверен, что это именно утиная типизация:
Это утиная типизация. )
0
 Аватар для vantfiles
1018 / 1921 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
29.10.2020, 14:34
Цитата Сообщение от korvin_ Посмотреть сообщение
Это утиная типизация. )
разница в количестве аргументов не смущает?
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
29.10.2020, 16:24
Цитата Сообщение от vantfiles Посмотреть сообщение
разница в количестве аргументов не смущает?
Утиная типизация - когда у объекта совершенно случайно находится подходящий метод. Случайно - значит никто не обещал, что он найдётся. Разница в количестве аргументов - показатель заниженных требований транслятора к слову "подходящий". Это как в JavaScript - можно вызвать любую функцию с любым количеством аргументов любого типа... достаточно, чтобы имя совпадало.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,781
29.10.2020, 16:38
Цитата Сообщение от vantfiles Посмотреть сообщение
разница в количестве аргументов не смущает?
Не особо, типичная вещь для многих динамически-типизированных языков.
0
 Аватар для vantfiles
1018 / 1921 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
29.10.2020, 18:10
Цитата Сообщение от Shamil1 Посмотреть сообщение
совершенно случайно находится подходящий метод. Случайно - значит никто не обещал, что он найдётся.
Я обещаю, чесслово совпадут. Клянусь своей треуголкой.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
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
819 / 578 / 75
Регистрация: 20.09.2014
Сообщений: 3,779
30.10.2020, 19:54
Настоящий полиморфизм - это не то, что вы называете настоящим полиморфизмом, просто потому что так хочется. Настоящий полиморфизм - его отличает то, что он специально поддерживается языком программирования.
Отсюда, поддержка языком динамических типов и наличие функции type_of() - это хрень, а не полиморфизм.
Настоящий полиморфизм - это перегрузка функции, так как язык поддерживает несколько морфов одной функции.
Полиморфизм - это только "поли" (много) и "морф" (форма) в языке.

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

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

Добавлено через 3 минуты
Вот пример полиморфизма - функция strike(), которая моделирует столкновение шариков друг с другом, либо столкновение шариков с подпружиненной поверхностью, потом столкновение шариков с песком и т.д. Кому тут дался ваш универсальный полиморфизм?
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
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
Ответ Создать тему
Новые блоги и статьи
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru