Шаг 80.
Язык программирования Go.
Ключевые понятия ООП (окончание)

    На этом шаге продолжим рассматривать ключевые понятия объектно-ориентированного программирования в Go.

    Другой необычной особенностью объектно-ориентированного программирования на языке Go является то обстоятельство, что интерфейсы, значения и методы определяются отдельно друг от друга.

    Интерфейсы используются для определения сигнатур методов, структуры – для определения агрегированных и встроенных значений. А методы – для реализации операций, поддерживаемых пользовательскими типами (которые часто являются структурами). В языке нет четкой связи между методами и каким-то определенным интерфейсом, но если тип обладает полным набором методов одного или нескольких интерфейсов, значения данного типа могут использоваться везде, где ожидаются эти интерфейсы. Любой тип соответствует пустому интерфейсу (interface{}), поэтому там, где ожидается пустой интерфейс, можно использовать значение любого типа.

    В объектно-ориентированном программировании на языке Go отношения типа "является" (is-a) определяются интерфейсами исключительно в терминах сигнатур методов. Таким образом, значение, реализующее интерфейс io.Reader (то есть имеющее метод с сигнатурой Read([]byte) (int, error)), считается значением, обеспечивающим возможность чтения данных, не потому, что оно таковым является (например, файлом, буфером или значением какого-то другого типа), а потому, что имеет определенные методы, в данном случае Read().

    Отношения типа "имеет" (has-a) определяются с помощью структур с агрегированными или встроенными значениями определенных типов, входящими в состав данного типа.

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

    На следующем шаге рассмотрим пользовательские типы в Go.


Предыдущий шаг Содержание Следующий шаг