我试图代表附近爆炸发生时戴眼镜的人在 window 附近。 main是爆炸过程中应做的事情的草图。某物应收集爆炸附近的物体 list ,并对每个物体执行特定的操作(例如粉碎或熔化)。玻璃和 window 破灭了,但是由于某种原因,人类也 splinter 了。为什么?

package main
import "fmt"
type Human struct { Glasses }
type Glasses struct {}
type Shatterable interface { shatter() }
func (g Glasses) shatter() {}
type Window struct {}
func (w Window) shatter() {}

func main() {
    h := Human{Glasses{}}
    objectsInProximity := []interface{}{h,h.Glasses,Window{}}
    for _,o := range objectsInProximity {
        shatter(o)
    }
}

func shatter(i interface{}) {
    s, ok := i.(Shatterable)
    if ok {
        fmt.Printf("shattering a %T\n", s)
        s.shatter()
    }
}
$ go run a.go
shattering a main.Human
shattering a main.Glasses
shattering a main.Window

最佳答案

this thread中所述:



(修改版本,因为术语“超集”令人困惑)

具有匿名字段的结构使用匿名字段声明的所有接口(interface)方法或结构本身满足每个接口(interface)。

type Human struct { Glasses }

由于Glasses可以粉碎,因此Human也满足相同的接口(interface)。

注意:在结构中嵌入匿名字段最接近“继承”,即使对“Golang: what's the point of interfaces when you have multiple inheritance”的回答提醒我们:



(这意味着Human扩展了... Glasses吗?!这可能表明某种设计缺陷)

我之前在“If struct A is embedded in B , can methods on A access method and fields of B ?”中解释过,这不是真正的子类型。



在这里,如果不应破坏Human,则不应包含匿名字段Glasses

10-04 19:08