
Alexey
22.01.2018
10:24:49
конечно есть примеры "наследование нужно", но это все как правило из серии "и так сойдет"

f4rt~
22.01.2018
10:25:55
многие популярные фреймворки завязанны на иерархии наследования

Adel
22.01.2018
10:27:54
я вот тоже думал что интерфейсы - это все что нужно. но абстрактные классы для многих вещей правильнее. Они в правильном направлении ограничивают пользователя. Чтобы не сделал class LoggerAndRepo111 implements Logger, UserRepository .
ну и еще пара плюсов.

Google

Adel
22.01.2018
10:28:32
это ограничивает и от более возможного сценария.
class SomeLogger extends SomeLegacyLogger implements LoggerInterface
чтобы не могли наследоваться так глупо

Maksim
22.01.2018
10:30:37
ну во всех языках нет мультинаследования, да)
но это какая-то весьма убогая аргументация, если честно)
если пользователь захочет отстрелить себе ноги, он и с абстрактными классами это сделает.

Артур Евгеньевич
22.01.2018
10:31:36
но 111 это пиздец конечно, я такого не видел

Maksim
22.01.2018
10:31:55

Sergey
22.01.2018
10:31:55

Adel
22.01.2018
10:31:59

Sergey
22.01.2018
10:32:21

Aleh
22.01.2018
10:32:22
и зависит от интерфейса

Google

Артур Евгеньевич
22.01.2018
10:32:52

Sergey
22.01.2018
10:32:54

Maksim
22.01.2018
10:33:16
ну формулировка в стиле "к классу нельзя прилепить несколько абстрактных, но можно несколько разных интерфейсов" - чушь, имхо. Такой себе повод устраивать замену.

Adel
22.01.2018
10:33:17

Sergey
22.01.2018
10:33:26
если у тебя есть 2 интерфейса и один класс их реализующий, и всю работу этот класс делегирует другим, и клиентский код завязан либо на тот или другой интерфейс - не вижу проблемы

Adel
22.01.2018
10:33:51

Артур Евгеньевич
22.01.2018
10:34:01

Sergey
22.01.2018
10:34:03
короч по поводу "правильности" и т.д. всегда надо рассуждать в контексте использования класса.
во имя ISP и все такое

Артур Евгеньевич
22.01.2018
10:36:36
так все таки, будет ли кейс когда нужно наследование реально нужно, а копозиция не подходит?)
Кроме упорядовачивания экспшнов

Andrew
22.01.2018
10:37:13

Ilia
22.01.2018
10:37:56

Артур Евгеньевич
22.01.2018
10:38:08
то есть мокаются интерфейсы где они есть, а если их нет, то веротяно можно обойтись норм объектом
но да с этим бывают заморочки

Ilia
22.01.2018
10:41:48
Потом, интерфейсы и ООП — это как-то ... немного разные вещи.

Google

Ilia
22.01.2018
10:43:57

Артур Евгеньевич
22.01.2018
10:44:43
сделать интерфейс-маркер
My

Ilia
22.01.2018
10:45:09
Ну и ? Сделаешь, далеее?
У тебя есть скажем 200 случаев скажем методов (функций), которые принимают MyObject.
Тебе надо добавить в иерархию этих классов ещё 10 классов. Как тебе интерфейс My поможет?

Sergey
22.01.2018
10:50:17
ну то есть ты и с интерфейсами тот же LSP обязан соблюдать

Артур Евгеньевич
22.01.2018
10:50:42

Sergey
22.01.2018
10:50:47
ну мол подтипы не только через наследование можно мутить же)

Ilia
22.01.2018
10:52:25
Я вот сходу так не помню.

Sergey
22.01.2018
10:53:16
Ну, расскажи, как ещё.
имплементация интерфейсов - подтипы, протоколы - те же контракты (ну то есть например у тебя есть 2 сервиса которые общаются по http и есть разные имплементации этог осервиса). То есть интерфейсы/протоколы могут быть менее явными

Ilia
22.01.2018
10:53:35

Sergey
22.01.2018
10:54:38
короч мне не нравится обсуждать абстрактный коней тем более когда они пахнут как факап с декомпозицией

Ilia
22.01.2018
10:56:03

Sergey
22.01.2018
10:57:01
у меня ООП вполне конкретный) message passing и late binding)
> код так написан, и используемый язык этого требует.
понятия не имею что мы в таком случае обсуждаем

Google

Sergey
22.01.2018
10:58:43
> но реализация интерфейса —частный случай наследования
следует различать наследование включающее в себя наследование стэйта и варианты где оно отсутствует.
когда мы поведение наследуем - то да, разницы между extend/implements нет

Артур Евгеньевич
22.01.2018
10:59:49

Sergey
22.01.2018
10:59:50

Ilia
22.01.2018
11:01:03

Артур Евгеньевич
22.01.2018
11:01:07
> Ну и ещё раз, мне нужно иметь ссылку на MyObject, а не на интерфейс My.
Что значит ссылка на объект? Ссылки ка краз и дает использование композиции, а в случае наследования ты получаешь кастомизированную вресию Ну и ещё раз, мне нужно иметь ссылку на MyObject, а не на интерфейс MyObject

Sergey
22.01.2018
11:01:16

Ilia
22.01.2018
11:01:51

Sergey
22.01.2018
11:02:07

Admin
ERROR: S client not available

Ilia
22.01.2018
11:02:11

Артур Евгеньевич
22.01.2018
11:02:17

Sergey
22.01.2018
11:02:20
я пока понял что у тебя есть система где все объекты являются подтипами MyObject

Ilia
22.01.2018
11:02:27

Sergey
22.01.2018
11:02:41
я не понимаю что именно ты хочешь описать

Ilia
22.01.2018
11:03:04
Ну, значит не судьба

Sergey
22.01.2018
11:03:08
ну... ладно)

Google

Артур Евгеньевич
22.01.2018
11:03:08

Sergey
22.01.2018
11:03:35
а само по себе наследование как вариант лепить подтипы - это и есть штука с которой можно добиться late binding по сути
но то как это реализовано в конкретном языке это уже детали

Артур Евгеньевич
22.01.2018
11:04:20
я так понимаю инкапсуляцию

Sergey
22.01.2018
11:04:50

Sergey
22.01.2018
11:04:52

Ilia
22.01.2018
11:04:54

Sergey
22.01.2018
11:05:31

Ilia
22.01.2018
11:05:33

Maksim
22.01.2018
11:05:47
а началось всё с наркоманской идеи о превосходстве абстрактных классов над интерфейсами...)

Sergey
22.01.2018
11:05:53

Ilia
22.01.2018
11:06:44

Sergey
22.01.2018
11:07:06

Sergey
22.01.2018
11:07:30

Sergey
22.01.2018
11:07:34
абстрактный класс без стэйта ~= интерфейс

Ilia
22.01.2018
11:07:57
Поясни
Так ты написал, ты и поясняй...
По-моему так всё ровно наоборот...

Sergey
22.01.2018
11:08:11

Ilia
22.01.2018
11:08:22