hakeの日記

Windows環境でプログラミングの勉強をしています。

Go言語 - 構造体の埋め込みをクラスの継承っぽく使用

埋め込んだ構造体の初期化を、その構造体の初期化関数で初期化するにはどうすれば良いのかわからなかったけれども、レシーバ.埋め込んだ構造体名.関数名()で埋め込んだ構造体に定義した関数を呼べるみたいなので初期化用関数Super()を作ってテスト。

ただし初期化関数から同じ構造体の他の関数を呼ぶと、埋め込んだ構造体側の関数が呼ばれるらしい

package main
import "fmt"

type A struct {
	x int
}
func NewA(x int) *A {
	a := new(A)
	a.Super(x)    // メンバ変数を初期化
	return a
}
func (self *A)Super(x int){
	self.x = x
}
func (self *A)Print(){
	fmt.Println("x =", self.x)
}

type B struct {      // BにAを埋め込む(継承っぽい)
	A
	y int
}
func NewB(x int, y int) *B {
	b := new(B)
	b.Super(x, y)    // メンバ変数を初期化
	return b
}
func (self *B)Super(x int, y int){
	self.A.Super(x)            // 埋め込んだ構造体Aの関数Super()を呼ぶ
	self.y = y
}
func (self *B)Print(){
	self.A.Print()             // 埋め込んだ構造体Aの関数Print()を呼ぶ
	fmt.Println("y =", self.y)
}


func main() {
	a := NewA(1) //=> x = 1
	a.Print()
	b := NewB(2,3)
	b.Print()    //=> x = 2
	             //=> y = 3
}