Ответ
Основное отличие заключается в подходе к их реализации и системе типов.
1. Неявная реализация vs. Явная реализация
- Go (неявная): Тип удовлетворяет интерфейсу автоматически, если у него есть все необходимые методы. Не требуется ключевое слово
implements
.- Преимущество: Код получается менее связанным. Вы можете реализовать интерфейс из сторонней библиотеки, не изменяя её исходный код.
- Java/C# (явная): Класс должен явно объявить, что он реализует интерфейс, с помощью ключевого слова (
implements
в Java,:
в C#). Компилятор проверит, что все методы интерфейса реализованы.- Преимущество: Намерение реализовать интерфейс всегда очевидно из кода класса.
2. Структурная типизация vs. Номинальная типизация
- Go (структурная): Важна только структура типа (какие у него есть методы). Если структура соответствует интерфейсу — тип ему удовлетворяет.
- Java/C# (номинальная): Важно имя (номен) интерфейса, которое класс явно указывает при реализации. Два интерфейса с одинаковым набором методов не являются взаимозаменяемыми, если у них разные имена.
3. Методы на любых типах
- Go: Методы можно определять для любого именованного типа (структуры,
int
,string
и т.д.), а не только для классов. - Java/C#: Методы являются частью классов, которые, в свою очередь, реализуют интерфейсы.
Итог
Аспект | Go | Java / C# (Классическое ООП) |
---|---|---|
Реализация | Неявная, автоматическая | Явная, с ключевым словом |
Система типов | Структурная | Номинальная |
Связанность | Низкая (decoupled) | Высокая (coupled) |
Гибкость | Выше, легко адаптировать сторонние типы | Ниже, требует явного намерения |