Различные структуры, реализующие один и тот же интерфейс в Голанге - PullRequest
1 голос
/ 12 апреля 2019

У меня есть интерфейс

type Shape interface {
    area() float32
    circumference() float32
}

Я хочу создать различные формы, такие как круг и прямоугольник, для круга мне нужно знать радиус, а для прямоугольника 2 стороны.Таким образом, код для каждого из них выглядит следующим образом:

type DataCircle struct {
     radius float
}

(*DataCircle) area() float32 {
    return 3.14 * DataCircle.radius * DataCircle.radius;
}

(*DataCircle) circumference() float32 {
    return 2 * 3.14 * DataCircle.radius;
}

Аналогично у нас есть код для прямоугольника, который реализует интерфейс Shape, со следующей структурой

type DataRectangle struct {
     side1 float
     side2 float
}

Я хочу создать многоразные прямоугольники и много разных кругов, каждый из которых имеет разные радиусы / стороны.В конце я хочу поместить их в один массив и иметь возможность сделать что-то вроде следующего:

for _, shape := range all_shapes_in_array {
    fmt.Printf("%f %f", shape.area(), shape.circumference())
}

В обычном объектно-ориентированном языке это довольно просто, но как мне это сделать на Голанге?

1 Ответ

2 голосов
/ 12 апреля 2019

Пока ваши структуры DataCircle и DataRectangle реализуют интерфейс Shape, вы сможете создавать массив / фрагмент типа Shape и выполнять итерацию по нему.

Если у вас уже есть реализация Shape, все что вам нужно сделать, это:

circle1 := &DataCircle{1}
circle2 := &DataCircle{2}
rec1 := &DataRectangle{1, 1}
rec2 := &DataRectangle{4, 1}

all_shapes_in_array := []Shape{circle1, circle2, rec1, rec2}
for _, shape := range all_shapes_in_array {
    fmt.Printf("%f %f", shape.area(), shape.circumference())
}

И все будет работать как положено.

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