Maison  >  Article  >  développement back-end  >  Autoriser l'utilisation de composites comme paramètres de fonction dans les structures

Autoriser l'utilisation de composites comme paramètres de fonction dans les structures

WBOY
WBOYavant
2024-02-05 22:30:031127parcourir

Autoriser lutilisation de composites comme paramètres de fonction dans les structures

Contenu de la question

Disons que je crée quelque chose comme un moteur de jeu.

J'ai besoin d'une structure GameObject pour définir certains gestionnaires d'événements :

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
 }

Ensuite, lorsque j'initialise des objets de jeu concrets, je souhaite définir le gestionnaire comme une fonction personnalisée :

g.updateHandler = func(self FishGameObject) {  // Error here
    self.tailMotionSpeed = self.boid.acceleration.Normalize().Len()
}

Notez que les membres de tailMotionSpeedboid 不是 GameObject 的成员。它们是 struct FishGameObject, cette structure possède des propriétés personnalisées et un GameObject anonyme :

type FishGameObject struct {
    leftFinPosition  float32
    rightFinPosition float32
    tailMotionSpeed  float32
    boid             Boid
    GameObject
}

Si je spécifie le paramètre comme GameObjectGetter, j'obtiens l'erreur self.tailMotionSpeed undefined(类型 GameObjectGetter 没有字段或方法 tailMotionSpeed),而且我收到错误 cannot use handler(类型为 func(self FishGameObject 的变量) )) 作为结构文字 dans la valeur func(self GameObjectGetter) (si je spécifie le paramètre comme FishGameObject). que dois-je faire?


Bonne réponse


Ce que vous voulez faire n'est pas possible dans Go comme vous voulez le faire. Cependant, vous pouvez faire ceci :

Définir GameObject comme interface :

type GameObject interface {
   GetTransform() *Transform
   GetAnimatedMesh() *AnimatedMesh
   SetUpdateHandler(func(GameObject))
   UpdateHandler() func(GameObject)
   ...
}

Vous pouvez définir un BaseGameObject : 

type BaseGameObject struct {
    transform        Transform
    animatedMesh     AnimatedMesh
    updateHandler    func(GameObject)
    onCreateHandler  func(GameObject)
    onDestroyHandler func(GameObject) 
}

Définissez toutes les méthodes telles que BaseGameObject 成为 GameObject devienne

.

FishGameObjectEnsuite, définissez

comme vous l'avez fait, mais

fish.SetUpdateHandler(func(self GameObject) {  
    fish:=self.(*FishGameObject)
     ...
   })

Vous devez également utiliser des récepteurs pointeurs pour toutes les méthodes. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer