1
0
mirror of https://github.com/MADTeacher/go_basics.git synced 2025-11-23 21:34:47 +02:00
Files
go_basics/part_3/3.7/golang/factory/main.go
2025-06-04 18:38:52 +03:00

86 lines
3.5 KiB
Go

package main
import (
"fmt"
"golang/factory/shape"
)
func printShapeName(name shape.IShapeName) {
fmt.Printf("IShapeName: %v\n", name.GetName())
}
func getIShapeFromRectangle(rectangle *shape.Rectangle) shape.IShape {
return rectangle // неявное приведение
// return shape.IShape(rectangle) // явное приведение
}
func main() {
rectangle := shape.NewRectangle(10, 6, shape.Point{X: 6, Y: -8}, "Gold")
ishape := shape.IShape(rectangle) // приведение Rectangle к интерфейсу
// приведение интерфейса IShape к интерфейсу IShapeArea
iShapeArea := shape.IShapeArea(ishape)
fmt.Printf("IShapeArea: %+v\n", iShapeArea.GetArea())
// явное обратное приведение интерфейса IShapePerimeter к интерфейсу IShape невозможно
// ishape = shape.IShape(iShapePerimeter) //error:
// cannot convert iShapePerimeter (variable of type shape.IShapePerimeter) to shape.IShape
// (shape.IShapePerimeter does not implement shape.IShape (missing method GetArea))
// правильное приведение интерфейса IShapeArea к интерфейсу IShape
ishape = iShapeArea.(*shape.Rectangle)
// аналогично
// newIshape := shape.IShape(iShapeArea.(*shape.Rectangle))
fmt.Printf("IShape center: %+v\n", ishape.GetCenter())
// правильное приведение интерфейса IShapeArea к структуре Rectangle
rectangle = iShapeArea.(*shape.Rectangle)
fmt.Printf("%s: %+v\n", rectangle.GetName(), *rectangle)
}
// func main() {
// rectangle1 := shape.NewRectangle(10, 6, shape.Point{X: 6, Y: -8}, "Gold")
// triangle1 := shape.NewTriangle(6, 10, 8, shape.Point{X: -85, Y: 15}, "Green")
// rectangle2 := shape.NewRectangle(3, 5, shape.Point{X: 46, Y: -48}, "Yellow")
// triangle2 := shape.NewTriangle(4, 8, 6, shape.Point{X: 61, Y: 98}, "Orange")
// // объявляем и инициализируем срез интерфейсного типа
// ishapeSlice := []shape.IShape{
// rectangle1,
// triangle1,
// triangle2,
// rectangle2,
// }
// for _, it := range ishapeSlice {
// fmt.Printf("Shape center coordinate: %+v\n", it.GetCenter())
// newCenter := shape.Point{
// X: it.GetCenter().X + 33,
// Y: it.GetCenter().Y - 20,
// }
// it.MoveCenter(newCenter)
// fmt.Printf("Shape new center coordinate: %+v\n", it.GetCenter())
// fmt.Println()
// }
// }
// func main() {
// rectangle := shape.NewRectangle(10, 6, shape.Point{X: 6, Y: -8}, "Gold")
// triangle := shape.NewTriangle(6, 10, 8, shape.Point{X: -85, Y: 15}, "Green")
// printShapeName(rectangle) // неявное приведение
// //printShapeName(shape.IShapeName(rectangle)) // явное приведение
// printShapeName(triangle)
// ishape := getIShapeFromRectangle(rectangle)
// fmt.Printf("Shape center: %v\n", ishape.GetCenter())
// fmt.Printf("Shape perimeter: %v\n", ishape.GetPerimeter())
// }
// func main() {
// rectangle := shape.NewRectangle(10, 6, shape.Point{X: 6, Y: -8}, "Gold")
// triangle := shape.NewTriangle(6, 10, 8, shape.Point{X: -85, Y: 15}, "Green")
// iShapeName := shape.IShapeName(triangle) // приведение Triangle к интерфейсу
// fmt.Printf("IShapeName: %v\n", iShapeName.GetName())
// iShapeName = shape.IShapeName(rectangle) // приведение Rectangle к интерфейсу
// fmt.Printf("IShapeName: %v\n", iShapeName.GetName())
// }