История изменений
Исправление Nervous, (текущая версия) :
Вот наш balanced-tree. У него есть функция rebalance, которой нет у tree
Это значит, что у них разные интерфейсы (протоколы). Можно объявить протокол Tree
(N функций) и протокол Balanced
(одна функция rebalance
).
Есть функция bar, которая что-то делает с balanced-tree и выполняет rebalance. Ей надо дать аргумент с типом-протоколом. Протокол Tree давать нельзя, так как в нём нет rebalance. То есть нужен некий Balanced-tree. Кстати, методы в нём все дублировать или только новые?
Чтобы bar
работала с каким-то значением, достаточно, чтобы его тип реализовал протоколы Tree
и Balanced
— то есть чтобы к нему можно было успешно применить методы этих протоколов и получить осмысленный результат. Что это значение представляет собой «на самом деле» (тм), каков его «истинный тип» — её не колышет. Что за глупости вообще, какой истинный тип, there is no such thing — мы делим вещи по типам исходя из того, что собираемся с ними делать, у них нет никаких внутренне присущих им типов. Для одной задачи дерево — это стройматериал, для другой — топливо, для третьей — развлекательный аттракцион.
Таким образом, дублировать ничего не надо — берём наш тип, реализующий Tree
, реализуем для него ещё и Balanced
(+1 функция) — вуаля, bar
работает с ним.
В языках со статической типизацией, наверное, придётся ещё немного поприседать, чтобы ублажить систему типов — к счастью, в кложе типизация динамическая.
Исправление Nervous, :
Вот наш balanced-tree. У него есть функция rebalance, которой нет у tree
Это значит, что у них разные интерфейсы (протоколы). Можно объявить протокол Tree
(N функций) и протокол Balanced
(одна функция rebalance
).
Есть функция bar, которая что-то делает с balanced-tree и выполняет rebalance. Ей надо дать аргумент с типом-протоколом. Протокол Tree давать нельзя, так как в нём нет rebalance. То есть нужен некий Balanced-tree. Кстати, методы в нём все дублировать или только новые?
Чтобы bar
работала с каким-то значением, достаточно, чтобы его тип реализовал протоколы Tree
и Balanced
— то есть чтобы к нему можно было успешно применить методы этих протоколов и получить осмысленный результат. Что это значение представляет собой «на самом деле» (тм), каков его «истинный тип» — её не колышет. Что за глупости вообще, какой истинный тип, there is no such thing — мы делим вещи по типам исходя из того, что собираемся с ними делать, у них нет никаких внутренне присущих им типов.
Таким образом, дублировать ничего не надо — берём наш тип, реализующий Tree
, реализуем для него ещё и Balanced
(+1 функция) — вуаля, bar
работает с ним.
В языках со статической типизацией, наверное, придётся ещё немного поприседать, чтобы ублажить систему типов — к счастью, в кложе типизация динамическая.
Исходная версия Nervous, :
Вот наш balanced-tree. У него есть функция rebalance, которой нет у tree
Это значит, что у них разные интерфейсы (протоколы). Можно объявить протокол Tree
(N функций) и протокол Balanced
(одна функция rebalance
).
Есть функция bar, которая что-то делает с balanced-tree и выполняет rebalance. Ей надо дать аргумент с типом-протоколом. Протокол Tree давать нельзя, так как в нём нет rebalance. То есть нужен некий Balanced-tree. Кстати, методы в нём все дублировать или только новые?
Чтобы bar
работала с каким-то значением, достаточно, чтобы его тип реализовал протоколы Tree
и Balanced
— то есть чтобы к нему можно было успешно применить методы этих протоколов и получить осмысленный результат. Что это значение представляет собой «на самом деле» (тм) — её не колышет.
Таким образом, дублировать ничего не надо — берём наш тип, реализующий Tree
, реализуем для него ещё и Balanced
(+1 функция) — вуаля, bar
работает с ним.
В языках со статической типизацией, наверное, придётся ещё немного поприседать, чтобы ублажить систему типов — к счастью, в кложе типизация динамическая.