Как реализовать полиморфизм у одной сущности с разными типами?

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

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

Рассмотрим пример. Предположим, у нас есть структура "Фигура", которая может быть представлена разными типами, такими как "Круг", "Прямоугольник" и "Треугольник". Мы хотим использовать одну функцию для вычисления площади, но с разными типами фигур.

type Figure interface {
    Area() float64
}

type Circle struct {
    radius float64
}

func (c Circle) Area() float64 {
    return math.Pi * c.radius * c.radius
}

type Rectangle struct {
    width  float64
    height float64
}

func (r Rectangle) Area() float64 {
    return r.width * r.height
}

type Triangle struct {
    base   float64
    height float64
}

func (t Triangle) Area() float64 {
    return 0.5 * t.base * t.height
}

func GetArea(f Figure) float64 {
    return f.Area()
}

В этом примере мы определяем интерфейс "Figure", который содержит только один метод "Area()". Затем мы создаем структуры "Circle", "Rectangle" и "Triangle", которые реализуют этот метод. Каждая структура представляет разную фигуру и имеет свою реализацию метода "Area()".

Далее мы создаем функцию "GetArea", которая принимает аргумент типа "Figure". Теперь мы можем передавать в эту функцию объекты разных типов фигур, потому что все они реализуют метод "Area()". Внутри функции "GetArea" будет вызываться соответствующая реализация "Area()" для каждого переданного объекта фигуры.

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

func main() {
    circle := Circle{radius: 5}
    rectangle := Rectangle{width: 3, height: 4}
    triangle := Triangle{base: 6, height: 8}

    fmt.Println("Площадь круга:", GetArea(circle))
    fmt.Println("Площадь прямоугольника:", GetArea(rectangle))
    fmt.Println("Площадь треугольника:", GetArea(triangle))
}

В результате мы получим вывод:

Площадь круга: 78.53981633974483
Площадь прямоугольника: 12
Площадь треугольника: 24

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