我一直在想很多关于我遇到的这个特殊问题,我应该如何以最干净的方式解决它。
想象一个看起来像这样的应用程序:
type AreaCalculator interface {
Area() int
}
type Rectangle struct {
color string
width int
height int
}
type (r *Rectangle) Area() int {
return r.width * r.height
}
type Circle struct {
color string
diameter int
}
type (c *Circle) Area() int {
return r.diameter / 2 * r.diameter / 2 * π
}
type Canvas struct {
children []AreaCalculator
}
func (c *Canvas) String() {
for child := range c.children {
fmt.Println("Area of child with color ", child.color, " ", child.Area())
}
}
此示例显然无法编译,因为虽然 Canvas 的 String() 方法可以调用 c.Area(),但它无法访问 c.color,因为无法确保实现 AreaCalculator 的结构具有该属性。
我能想到的一种解决方案是这样做:
type AreaCalculator interface {
Area() int
Color() string
}
type Rectangle struct {
color string
width int
height int
}
type (r *Rectangle) Color() string {
return r.color
}
type (r *Rectangle) Area() int {
return r.width * r.height
}
type Circle struct {
color string
diameter int
}
type (c *Circle) Area() int {
return r.diameter / 2 * r.diameter / 2 * π
}
type (c *Circle) Color() string {
return c.color
}
type Canvas struct {
children []AreaCalculator
}
func (c *Canvas) String() {
for child := range c.children {
fmt.Println("Area of child with color ", child.Color(), " ", child.Area())
}
}
茅侃侃
汪汪一只猫
相关分类