Clojure позволяет deftype
S, которые реализуют интерфейс неполностью, такие какнеполная реализация интерфейсов в Clojure
(deftype Foo [x] clojure.lang.ISeq (next [this] x))
(Foo
не реализует seq
). Исходя из питонской земли утиной печати или, в лучшем случае (или, что хуже всего, в зависимости от вашего POV), ABC, мне трудно понять, почему такие неполные разрешены для реализации, поскольку я думал, что точка интерфейсов должна гарантировать наличие набор методов (как это прямо сейчас, кажется, что безопасно использовать чужие deftype
s я должен был бы обернуть каждый вызов метода в try...catch
).
Уверенный, требующий полной реализации, делает интерактивное программирование сложнее, но как cac вы утверждаете, что реализуете ISeq, когда на самом деле этого не делаете? Я имею в виду, если вам разрешено не полностью реализовывать интерфейс, я могу также утверждать, что моя часть кода реализует все существующие интерфейсы (это просто так часто увеличивает AbstractMethodError). – antony
@atony, я писал Clojure в течение 4 лет. На практике это не проблема. – dnolen
Я предполагаю, что это означает, что протоколы должны действительно считаться формой метаданных и что только протокольные функции являются «реальными»? – antony