LINUX.ORG.RU

История изменений

Исправление 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 работает с ним.

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