3 回答

TA貢獻1891條經(jīng)驗 獲得超3個贊
我明白你想做什么,但這是不可能的:你的Cat和Dog類型沒有實現(xiàn)Pet接口,因為它們的Play方法采用不同的類型,所以你不能只用Play你的SuperToy.
要解決此問題,您需要創(chuàng)建一個Toy接口,該接口同時具有Roll和Rattle方法以及 make Pet.Play,Cat.Play并將Dog.Play此接口作為參數(shù)。
package main
type Cat struct {
}
func (cat *Cat) Play(catToy Toy) {
println("The cat is playing!", catToy.Rattle())
}
type Dog struct {
}
func (dog *Dog) Play(dogToy Toy) {
println("The dog is playing!", dogToy.Roll())
}
type Toy interface {
Roll() string
Rattle() string
}
type SuperToy struct {
}
func (toy *SuperToy) Rattle() string {
return "Rattle!!!"
}
func (toy *SuperToy) Roll() string {
return "Rolling..."
}
type Pet interface {
Play(toy Toy)
}
func main() {
cat := &Cat{}
dog := &Dog{}
superToy := &SuperToy{}
// Working
cat.Play(superToy)
dog.Play(superToy)
// Not Working
pets := []Pet{cat, dog}
for _, pet := range pets {
pet.Play(superToy)
}
}
給出輸出
The cat is playing! Rattle!!!
The dog is playing! Rolling...
The cat is playing! Rattle!!!
The dog is playing! Rolling...

TA貢獻1851條經(jīng)驗 獲得超3個贊
您可以讓 Play 方法接受一個interface{},然后在方法內(nèi)進行類型斷言:
func (dog *Dog) Play(toy interface{}) {
dogToy, isDogToy := toy.(DogToy)
if !isDogToy {
println("The dog does not know what to do with this toy!")
return
}
println("The dog is playing!", dogToy.Roll())
}
Go Playground 上的完整可執(zhí)行示例:
https://play.golang.org/p/LZZ-HqpzR-Z

TA貢獻1802條經(jīng)驗 獲得超5個贊
這是另一個可行的解決方案:
package main
type CatToy interface {
? ? Rattle() string
}
type Cat struct {
? ? Toy CatToy
}
func (cat *Cat) Play() {
? ? println("The cat is playing!", cat.Toy.Rattle())
}
type DogToy interface {
? ? Roll() string
}
type Dog struct {
? ? Toy DogToy
}
func (dog *Dog) Play() {
? ? println("The dog is playing!", dog.Toy.Roll())
}
type SuperToy struct {
}
func (toy *SuperToy) Rattle() string {
? ? return "Rattle!!!"
}
func (toy *SuperToy) Roll() string {
? ? return "Rolling..."
}
type Pet interface {
? ? Play()
}
func main() {
? ? superToy := &SuperToy{}
? ? cat := &Cat{superToy}
? ? dog := &Dog{superToy}
? ? // Working
? ? cat.Play()
? ? dog.Play()
? ? // Working also
? ? pets := []Pet{cat, dog}
? ? for _, pet := range pets {
? ? ? ? pet.Play()
? ? }
}
該解決方案使Cat + CatToy和Dog + DogToy獨立于main + SuperToy. 這允許提取以分離包。
- 3 回答
- 0 關注
- 109 瀏覽
添加回答
舉報