📝

Golangで継承っぽいことをやりたい (親クラスのメソッドから子クラスでoverrideしたメソッドを参照)

2020/10/21に公開1

やりたいこと

  • 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

もっといい方法があれば教えて下さい。

GitHubで編集を提案