Golang ООП разъяснения - PullRequest
       10

Golang ООП разъяснения

0 голосов
/ 30 августа 2018

У меня есть два интерфейса, написанные на go, один из которых является подмножеством другого

type x interface {
    a()
}

type y interface {
    a()
    b()
}

У меня также есть структура, которая имеет методы как таковые

type z struct {
    some string
}

func (s z) a() {
    // do stuff
}

func (s z) b() {
    // do stuff
}

У меня есть несколько вопросов по этому поводу, а именно:

  1. Правильно ли я сказал, что z реализует и x, и y?
  2. Что такое концепция ООП для одной структуры, реализующей несколько интерфейсов таким образом?

Я пытался спросить нескольких коллег, которые, кажется, склоняются к polymorphism в качестве ответа, хотя они не слишком уверены. Запись википедии о полиморфизме говорит, что это «предоставление единого интерфейса сущностям разных типов», но для меня это прямое обратное. Я также обнаружил в других источниках (например, this ), что Go на самом деле не "язык ООП".

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Сначала мне было сложно освоить интерфейсы Go. Я имею многолетний опыт работы с Java, C ++, Python ... Лучший способ IMHO получить максимальную отдачу от Go, а также любого другого нового языка - не писать Java или C ++ в синтаксисе Go. Поймите, как все работает в Go, и используйте его. Терминология не может быть точным отображением 1 к 1, и это не имеет значения.

Думайте об интерфейсе Go как о группе сигнатур методов, работающих с некоторой группой данных (структура). Подобно тому, как интерфейс Java представляет собой просто набор сигнатур методов в классе. Основное отличие состоит в том, что в Go вы не должны указывать, что struct implements интерфейс, язык сделает это за вас. Если вы указываете методы для структуры, она автоматически реализует интерфейс.

0 голосов
/ 30 августа 2018

Вы правильно сказали бы, что z реализует оба интерфейса.

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

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

Go способен поддерживать объектно-ориентированные и процедурно-ориентированные стили программирования. Он считается объектно-ориентированным языком программирования.

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

0 голосов
/ 30 августа 2018

Да, z реализует как x, так и y. Вы можете доказать это, используя объявление переменной для назначения конкретного типа типу интерфейса:

var _ x = z{}
var _ y = z{}

Это дает вам проверку времени компиляции, чтобы убедиться, что тип реализует интерфейсы, которые вы хотите.

В качестве примечания: если вы явно хотите, чтобы y было x + some more methods, то имеет смысл написать это так:

interface y {
    x
    b()
}

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

Более того, в Go типы (также неструктурные) не связаны с интерфейсами, когда они определены. Даже если тип не был написан для реализации какого-либо интерфейса, вы можете сделать , чтобы он реализовал любое количество интерфейсов, определяя новые интерфейсы с другими именами и / или различными комбинациями методов из типа. Это делает придание имени концепции еще сложнее - как вы узнаете имя во время определения типа, когда интерфейсы могут быть определены позже в другом пакете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...