📝
Golangで継承っぽいことをやりたい (親クラスのメソッドから子クラスでoverrideしたメソッドを参照)
やりたいこと
- Python
class Dog:
def __init__(self, name):
self.name = name
def info(self):
print(self.name)
self.barking()
def bark(self):
print("bowwow")
class ShibaInu(Dog):
def __init__(self, name):
super().__init__(name)
def bark(self):
print("wanwan")
taro = ShibaInu("taro")
taro.info()
taro
wanwan
Golang でやりたい
Golang はクラスが無いので、上記の子クラス ShibaInu で override した bark()
を親クラス Dog の info()
から呼び出すといったことが出来ない。
package main
import "fmt"
type Dog struct {
name string
}
func (d Dog) Info() {
fmt.Println(d.name)
d.Bark()
}
func (d Dog) Bark() {
fmt.Println("bowwow")
}
type ShibaInu struct {
Dog
}
func NewShibaInu(name string) ShibaInu {
return ShibaInu{Dog{name}}
}
func (d ShibaInu) Bark() {
fmt.Println("wanwan")
}
func main() {
taro := NewShibaInu("taro")
taro.Info()
}
taro
bowwow
Golang でやる
Bark()
を要求する interface を親クラスにあたる Dog の Info()
の引数に取る。
package main
import "fmt"
type Dog struct {
name string
}
func (d Dog) Info(i interface {
Bark()
}) {
fmt.Println(d.name)
i.Bark()
}
func (d Dog) Bark() {
fmt.Println("bowwow")
}
type ShibaInu struct {
Dog
}
func NewShibaInu(name string) ShibaInu {
return ShibaInu{Dog{name}}
}
func (d ShibaInu) Bark() {
fmt.Println("wanwan")
}
func main() {
taro := NewShibaInu("taro")
taro.Info(taro)
}
taro
wanwan
もっといい方法があれば教えて下さい。
Discussion
参考に https://qiita.com/Maki-Daisuke/items/511b8989e528f7c70f80