Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Benarkan penggunaan komposit sebagai parameter fungsi dalam struktur

Benarkan penggunaan komposit sebagai parameter fungsi dalam struktur

WBOY
WBOYke hadapan
2024-02-05 22:30:031127semak imbas

Benarkan penggunaan komposit sebagai parameter fungsi dalam struktur

Kandungan soalan

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 tailMotionSpeedboid 不是 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?


Jawapan betul


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

.

FishGameObjectKemudian, tentukan

seperti yang anda lakukan, tetapi

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam