このコードが正しく実行されません:行くの継承やポリモーフィズム
package main
import "fmt"
type Human interface {
myStereotype() string
}
type Man struct {
}
func (m Man) myStereotype() string {
return "I'm going fishing."
}
type Woman struct {
}
func (m Woman) myStereotype() string {
return "I'm going shopping."
}
func main() {
var m *Man
m = new (Man)
w := new (Woman)
var hArr []*Human
hArr = append(hArr, m)
hArr = append(hArr, w)
for n, _ := range (hArr) {
fmt.Println("I'm a human, and my stereotype is: ",
hArr[n].myStereotype())
}
}
それはして存在している:
tmp/sandbox637505301/main.go:29:18: cannot use m (type *Man) as type *Human in append:
*Human is pointer to interface, not interface
tmp/sandbox637505301/main.go:30:18: cannot use w (type *Woman) as type *Human in append:
*Human is pointer to interface, not interface
tmp/sandbox637505301/main.go:36:67: hArr[n].myStereotype undefined (type *Human is pointer to interface, not interface)
しかし、この1は正常に動作します(VARのハーは、[] *ヒトは、VaRのハールの[に書き換えられますヒト):
package main
import "fmt"
type Human interface {
myStereotype() string
}
type Man struct {
}
func (m Man) myStereotype() string {
return "I'm going fishing."
}
type Woman struct {
}
func (m Woman) myStereotype() string {
return "I'm going shopping."
}
func main() {
var m *Man
m = new (Man)
w := new (Woman)
var hArr []Human // <== !!!!!! CHANGED HERE !!!!!!
hArr = append(hArr, m)
hArr = append(hArr, w)
for n, _ := range (hArr) {
fmt.Println("I'm a human, and my stereotype is: ",
hArr[n].myStereotype())
}
}
出力がOKです:
I'm a human, and my stereotype is: I'm going fishing.
I'm a human, and my stereotype is: I'm going shopping.
そして、なぜ私は理解できません。 mとwがポインタであるため、hArrをHumanのポインタの配列として定義すると、コードが失敗するのはなぜですか?
はあなたの主な問題は、あなたがインターフェイスへのポインタを使用していることであるあなたの説明
Goには継承がないため、 "is a"型の多型がありません。 – JimB
[インタフェースを使用した任意のタイプのキューの作成](https://stackoverflow.com/questions/35595810/using-interfaces-to-create-a-queue-for-arbitrary-types)の可能な複製 – IanAuld