「GO言語でクラスっぽいことをする」をレビューする
Goにはクラスの概念がありません。
C++で作ってきたプログラムをGoに移植しているのですが、クラスで記載した部分を上手いこと使い回したくても、それができなくて困っていました。
で、
GO言語でクラスっぽいことをする
という記事を見つけて、これを使って勉強させて頂いていますが、困ったことがあります。
プログラムの中の変数の意味が分からない ―― HPとか、MPとか、APは、アニメ(多分ゲームも?)の中では頻繁に登場するのですが、私は何の略号か分からなかったので、サンプルプログラムの意味が読み解けませんでした。
そこで、上記記事に記載されていたプログラムに、そのまま、私の為に、コメントを付けさせて頂きました。
package main
import (
"fmt"
)
const line = "--------------------"
func main() {
wiz := newWizard("魔法少女", 10, 10, 5)
war := newWarrior("+‡†狂戦士†‡+", 10, 15, 30)
fmt.Println(wiz.hello())
fmt.Println(war.hello())
fmt.Println(line)
fmt.Println(wiz.attack())
fmt.Println(war.attack())
fmt.Println(line)
fmt.Println(wiz.magic())
fmt.Println(war.attack())
}
type human struct { // "人間"という基底クラス
name string
hp int
ap int
}
func (h *human) init(name string, hp, ap int) { // "人間"という基底クラスのコンストラクタ(3つの初期値を入れていることに注意))
h.name = name // 名前
h.hp = hp // ヒットポイント: ゲームにおいてキャラの体力や生命力を示すステータスの一つ
h.ap = ap // アタックポイント: ゲームにおいてキャラの行動力などを示すステータスの一つ
}
func (h *human) hello() string { // "人間"という基底クラスのメソッド1
return fmt.Sprintf("こんにちは、私は%sです。", h.name)
}
func (h *human) attack() string { // "人間"という基底クラスのメソッド2
return fmt.Sprintf("%sの攻撃!%dのダメージ!", h.name, h.ap)
}
type wizard struct { // "魔法使い"というクラス
human // "人間の属性"を手動挿入
mp int // マジックポイント: ゲームにおいてキャラの魔法や呪文を使う力を示すステータスの一つ
}
func newWizard(name string, hp, ap, mp int) *wizard { // "魔法使い"クラスのコンストラクタ(4つの初期値を入れていることに注意))
w := new(wizard) // "魔法使い"の実体生成
w.init(name, hp, ap) // "基底クラス"の属性値の設定
w.mp = mp // 新しい属性値の設定
return w
}
func (w *wizard) magic() string {
if w.mp <= 0 {
return fmt.Sprintf("%sは力がでない", w.name)
}
w.mp -= 1
return fmt.Sprintf("%sは魔法を使った!30のダメージ!", w.name)
}
type warrior struct {
human // "人間の属性"のみを手動挿入
}
func newWarrior(name string, hp, ap, mp int) *warrior {
w := new(warrior)
w.init(name, hp, ap)
// mpは使わない? Warrior(戦士)は、マジックポイントを持たないものなの?
return w
}
func (w *warrior) attack() string {
return fmt.Sprintf("%sの攻撃!%dのダメージ!", w.name, w.ap*2)
}
なるほど、変数の意味が分かれば、プログラムの趣旨が読み取れました ―― 加えて、アニメの中の台詞も理解できるようになり、一石二鳥でした。
ゲームをやっている人であれば、「今更なこと」だったんだろうな、と思っています。
とほほのGo言語入門 構造体(struct)
を読んでいたら、構造体(struct)でクラスと同じことができることが分かりました。
また、インタフェース(interface)を使えばポリモーフィズムもできるみたいでした。
しかも、コンストラクタとかデストラクタとか、面倒なものもを入れていないという点も好印象です。
『Golangの設計者、よく分かってるじゃん!』と、絶賛賞賛中です。