Rumah > Artikel > pembangunan bahagian belakang > Benarkan penggunaan komposit sebagai parameter fungsi dalam struktur
Katakan saya membuat sesuatu seperti enjin permainan.
Saya memerlukan struct GameObject untuk menentukan beberapa pengendali acara:
type GameObject struct { transform Transform animatedMesh AnimatedMesh updateHandler func(self GameObjectGetter) onCreateHandler func(self GameObjectGetter) onDestroyHandler func(self GameObjectGetter) } func (g GameObject)getGameObject() GameObject { return g } type GameObjectGetter interface { getGameObject() GameObject }
Kemudian apabila saya memulakan beberapa objek permainan konkrit, saya ingin menentukan pengendali sebagai fungsi tersuai:
g.updateHandler = func(self FishGameObject) { // Error here self.tailMotionSpeed = self.boid.acceleration.Normalize().Len() }
Perhatikan bahawa ahli tailMotionSpeed
和 boid
不是 GameObject 的成员。它们是 struct FishGameObject
, struktur ini mempunyai beberapa sifat tersuai dan GameObject tanpa nama:
type FishGameObject struct { leftFinPosition float32 rightFinPosition float32 tailMotionSpeed float32 boid Boid GameObject }
Jika saya menentukan parameter sebagai GameObjectGetter, saya mendapat ralat self.tailMotionSpeed undefined(类型 GameObjectGetter 没有字段或方法 tailMotionSpeed)
,而且我收到错误 cannot use handler(类型为 func(self FishGameObject 的变量) )) 作为结构文字
dalam nilai func(self GameObjectGetter) (jika saya nyatakan parameter sebagai FishGameObject). apa yang saya buat?
Apa yang anda mahu lakukan tidak boleh dilakukan dalam Pergi dengan cara yang anda mahu lakukan. Walau bagaimanapun, anda boleh melakukan ini:
Takrifkan GameObject
sebagai antara muka:
type GameObject interface { GetTransform() *Transform GetAnimatedMesh() *AnimatedMesh SetUpdateHandler(func(GameObject)) UpdateHandler() func(GameObject) ... }
Anda boleh mentakrifkan BaseGameObject
:
type BaseGameObject struct { transform Transform animatedMesh AnimatedMesh updateHandler func(GameObject) onCreateHandler func(GameObject) onDestroyHandler func(GameObject) }
Tentukan semua kaedah supaya BaseGameObject
成为 GameObject
menjadi
FishGameObject
Kemudian, tentukan
fish.SetUpdateHandler(func(self GameObject) { fish:=self.(*FishGameObject) ... })Anda juga harus menggunakan penerima penunjuk untuk semua kaedah. 🎜
Atas ialah kandungan terperinci Benarkan penggunaan komposit sebagai parameter fungsi dalam struktur. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!