演習2-2
演習2-1で定義したHelloWorldを埋め込み,さらに別のメンバー変数lang(整数型)をもつ構造体MultilingalHelloを定義せよ.また,構造体MultilingalHelloの言語を設定するメソッドSetLanguageを作成せよ.このメソッドは,言語を表す整数型の引数を一つもつものとし,引数の値によって,メンバー変数の値を次のように設定するものとする.
0: lang=0 hello="Hello, World!"
1: lang=1 hello="こんにちは、世界。"
2: lang=2 hello="Bonan tagon"
解答例
解答例
- package main
- import "fmt"
- type HelloWorld struct {
- hello string
- }
- func (h *HelloWorld) SayHello() {
- fmt.Printf(h.hello+"\n")
- }
- func (h *HelloWorld) SetHello(hello string) {
- h.hello = hello
- }
- type MultilingalHello struct {
- HelloWorld
- lang int
- }
- func (m *MultilingalHello) SetLanguage(lang int) {
- m.lang = lang
- switch lang {
- case 0:
- m.hello = "Hello, World!"
- case 1:
- m.hello = "こんにちは、世界。"
- case 2:
- m.hello = "Bonan tagon"
- }
- }
- func main() {
- m := new(MultilingalHello)
- m.SayHello() // HelloWorldのメソッドSayHello,SetHelloをそのまま使える(継承のように)
- m.SetHello("Hello, World!")
- m.SayHello()
- m.SetLanguage(1) // もちろん新たに定義したメソッドも使える
- m.SayHello()
- m.SetLanguage(0)
- m.SayHello()
- m.SetLanguage(2)
- m.SayHello()
- m.HelloWorld.SayHello() // HelloWorldのメソッドを明示的に呼び出すこともできる
- }
解説
解説
匿名フィールド
- フィールドが型だけでフィールド名を指定せずに宣言されたときは匿名フィールドとなります(埋め込みフィールドとも呼ばれます).
- 解答例では,HelloWorldがMultilingalHelloの匿名フィールドとして定義されています(17行目)
- 匿名フィールド内のフィールドとメソッドは,その外側の型のフィールドとメソッドへ昇格されます.すなわち,継承のようなことができます.
- 解答例では,HelloWorldのメソッドSetHello(),SayHello()をその外側の構造体MultilingalHelloのメソッドとして呼び出すことができます(35-37行目).
- 匿名フィールドに関する詳細は,言語仕様の構造体型,セレクタを参照してください.