← Назад ко всем вопросам

Как реализован полиморфизм в Go

1️⃣ Как кратко ответить

Полиморфизм в Go реализован через интерфейсы. Интерфейсы позволяют определять набор методов, которые должны быть реализованы типами, чтобы считаться реализацией этого интерфейса. Это позволяет использовать разные типы, реализующие один и тот же интерфейс, как взаимозаменяемые.

2️⃣ Подробное объяснение темы

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

Интерфейсы в Go

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

Пример интерфейса:

type Shape interface {
    Area() float64
    Perimeter() float64
}

В этом примере интерфейс Shape определяет два метода: Area и Perimeter. Любой тип, который реализует эти методы, будет считаться реализацией интерфейса Shape.

Реализация интерфейса

Рассмотрим, как типы могут реализовать интерфейс Shape.

type Rectangle struct {
    Width, Height float64
}
​
// Метод для вычисления площади прямоугольника
func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}
​
// Метод для вычисления периметра прямоугольника
func (r Rectangle) Perimeter() float64 {
    return 2 * (r.Width + r.Height)
}
type Circle struct {
    Radius float64
}
​
// Метод для вычисления площади круга
func (c Circle) Area() float64 {
    return 3.14159 * c.Radius * c.Radius
}
​
// Метод для вычисления периметра (окружности) круга
func (c Circle) Perimeter() float64 {
    return 2 * 3.14159 * c.Radius
}

В этом примере Rectangle и Circle реализуют интерфейс Shape, так как они оба имеют методы Area и Perimeter.

Использование интерфейсов

Интерфейсы позволяют писать код, который может работать с любым типом, реализующим интерфейс. Это делает код более гибким и расширяемым.

func PrintShapeInfo(s Shape) {
    fmt.Printf("Area: %f\n", s.Area())
    fmt.Printf("Perimeter: %f\n", s.Perimeter())
}

Функция PrintShapeInfo принимает параметр типа Shape. Это значит, что она может работать с любым типом, который реализует интерфейс Shape, например, с Rectangle или Circle.

Пример использования

func main() {
    r := Rectangle{Width: 3, Height: 4}
    c := Circle{Radius: 5}
​
    PrintShapeInfo(r)
    PrintShapeInfo(c)
}

В этом примере создаются объекты Rectangle и Circle, которые передаются в функцию PrintShapeInfo. Функция вызывает методы Area и Perimeter для каждого объекта, демонстрируя полиморфизм.

Зачем это нужно

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

Тема: Типы и коллекции
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки