Ответ
В Go принят подход "композиция вместо наследования". Вместо классов используются структуры (struct
) для данных и интерфейсы (interface
) для поведения.
Эмуляция Класса
Класс в классическом ООП — это шаблон для объектов, объединяющий данные (поля) и поведение (методы). В Go эту роль выполняет структура с методами.
// Аналог класса "Собака"
type Dog struct {
Name string
Age int
}
// Метод для структуры Dog
func (d Dog) Bark() string {
return "Гав!"
}
Эмуляция Абстрактного Класса
Абстрактный класс — это базовый класс, который нельзя инстанцировать и который определяет набор методов (некоторые могут быть без реализации), обязательных для наследников. В Go эта концепция реализуется через интерфейсы.
Интерфейс в Go — это набор сигнатур методов. Любой тип, реализующий все методы интерфейса, неявно удовлетворяет этому интерфейсу.
// Аналог абстрактного класса "Животное"
type Animal interface {
Speak() string
GetName() string
}
// Dog реализует интерфейс Animal
func (d Dog) Speak() string {
return "Гав!"
}
func (d Dog) GetName() string {
return d.Name
}
// Cat тоже реализует интерфейс Animal
type Cat struct {
Name string
}
func (c Cat) Speak() string {
return "Мяу!"
}
func (c Cat) GetName() string {
return c.Name
}
Ключевые отличия от классического ООП
Аспект | Классическое ООП (Java, C++) | Подход в Go |
---|---|---|
Наследование | Классы могут наследовать реализацию от одного родителя. | Нет наследования реализации. Используется встраивание (embedding) для композиции. |
Полиморфизм | Через наследование и виртуальные методы. | Через интерфейсы. Тип удовлетворяет интерфейсу неявно. |
Иерархия | Жесткая иерархия классов. | Гибкая система, основанная на поведении (методах). |
Абстракция | Абстрактные классы и интерфейсы. | Только интерфейсы. |