Go言語に継承は無いんですか【golang】
困った
継承が無いのは困った。共通メソッドとかどうすりゃええねん的な。 前回のダックタイピングって一体なんなのよ【golang】 - DRYな備忘録に引き続き、めっちゃ参考にしたのはこれ
- 作者: 松木雅幸,mattn,藤原俊一郎,中島大一,牧大輔,鈴木健太,稲葉貴洋
- 出版社/メーカー: 技術評論社
- 発売日: 2016/09/09
- メディア: 大型本
- この商品を含むブログ (3件) を見る
埋め込み(embed)っていうのがあるのだ
golangはstructの定義にstructの定義を「埋め込む(embed)」ことができる。それはプロパティを持たせるのとは違う。(継承に近い、が、ダックタイピングと合い重なって色々できそうな予感ある)
package main import "fmt" // いわゆる基底クラス想定 type MyBase struct { count int } func (b *MyBase)Increment() int { b.count++ return b.count } // 適当なプロパティになってもらいましょう type MyProperty struct { Value string } // こっちは上記と同じだけどあえて埋め込むやつ type AnotherPropery struct { AnotherValue string } // 別の世界線では、子クラス、と呼ばれるもの type SubStruct struct { *MyBase//埋め込む SomePropery *MyProperty//名前のあるプロパティとして持たせる *AnotherPropery//埋め込む } // "継承"されているはずのメソッドを使ってみる func (s *SubStruct)IncrementByTwo() int { s.Increment() return s.Increment() } func main() { sub := &SubStruct{ &MyBase{0}, &MyProperty{"ほげ"}, &AnotherPropery{"ふがふが"}, } fmt.Println( sub.Increment(),// たぶん1 sub.IncrementByTwo(),// たぶん3 sub.IncrementByTwo(),// たぶん5 sub.SomePropery.Value,// たぶん"ほげ" /* SomeProperyはプロパティであって埋め込みじゃないので * Valueではアクセスできない */ //sub.Value, /* 一方、AnotherProperyは埋め込みなので * AnotherValueは直でアクセスできる */ sub.AnotherValue, ) }
結果
[21:51:20] → go run sample.go 1 3 5 ほげ ふがふが [21:51:24] →
まとめ
- 継承は無いけど、structの定義の埋め込みがある
こういうことかな
DRYな備忘録