Объектно-ориентированное программирование, по крайней мере на самых известных языках, включает в себя слишком много обсуждения отношений между типами, отношений, которые часто могут быть получены автоматически. Go использует другой подход.
Вместо того, чтобы требовать от программиста заранее объявить, что два типы связаны, в Go тип автоматически удовлетворяет любому интерфейсу - это определяет подмножество его методов. Помимо уменьшения количества кода, у этого подхода есть реальные преимущества. Типы могут удовлетворить много интерфейсов одновременно, без сложностей традиционного множественного наследования. Интерфейсы могут быть очень легкими - интерфейсы с одним методом или даже без метода могут выразить полезную концепцию. Интерфейсы могут быть добавлены после того, как придет новая идея или для тестирования - без указания оригинальных типов. Поскольку нет явных отношений между типами и интерфейсами, нет иерархии типов для управления ими или обсуждения их.
Можно использовать эти идеи для создания чего-то аналогичного безопасных для типов Unix pipes. Например, посмотрите, как fmt.Fprintf
позволяет форматировать печать на любой вывод, не только файл, или как пакет bufio
может быть полностью отделен от файлового ввода-вывода, или как пакеты image
генерируют сжатые файлы изображений. Все эти идеи проистекают из единого интерфейса (io.Writer
), представляющего один метод (Write
). И это только малая часть. Интерфейсы Go оказывают глубокое влияние на структуру программ.
Требуется некоторое привыкание, но этот неявный стиль зависимости типа - одна из самых продуктивных вещей в Go.
Читайте также:
1 комментарий:
Ну вот не согласен
что делать если мне нужна общая имплементация какого то метода или группы методов
в нескольких "наследуемых" типах? при этом метод вызывает другие методы, часть которых уже "переопределена" а часть "нет"
я вроде решил это через определение интерфейса который подаю на вход
в общем статья требует показать реальные примеры с code reusage
Отправить комментарий