2017-10-06 14 views
0

J'ai une classe de base qui a une fonction qui ne sait pas ce qu'une des fonctions qu'elle appelle fera. Ce comportement est défini dans l'enfant. La fonction parents est alors appelée depuis l'enfant. Quelle est la syntaxe/méthode correcte pour que cela fonctionne? En particulier, que dois-je mettre à la place de FunctionToBeDefinedLater Exemple suit:Enfant appelant une fonction parente qui utilise la fonction enfant dans Unity

public class ToolScript : MonoBehaviour { 
    public void isActive() 
    { 
     if (Input.GetKeyDown("space")) 
     { 
      Use(); 
     } 
    } 
    FunctionToBeDefinedLater Use(); 
} 

public class GunController : ToolScript 
{ 
    public void Use() 
    { 
     //Spawn bullet at this direction, this speed, give it spiral, tons of behavior etc. etc. 
    } 
    private void Update() 
    { 
     isActive(); 
    } 
} 

public class FlamethrowerController : ToolScript 
{ 
    public void Use() 
    { 
     //Spawn fire at this direction, this speed, set tip of flamethrower to be red etc etc 
    } 
    private void Update() 
    { 
     isActive(); 
    } 

} 

La fonction Update est de l'unité et est appelée à chaque trame. S'il vous plaît laissez-moi savoir si je peux clarifier ma question plus loin et je le ferai dès que possible. Je ne sais pas si cela fait référence au remplacement, à l'interfaçage ou à l'abstraction, donc je les ai tous tagués. Je vais régler ça dès que je le saurai.

+2

En savoir plus sur les méthodes abstraites et virtuelles ici: https://stackoverflow.com/questions/14728761/difference-between-virtual-and-abstract-methods –

Répondre

0

D'après ce que Curtiss m'a dirigé @ Michael I ai mis à jour mon code pour être:

public **abstract** class ToolScript : MonoBehaviour { 
    public void isActive() 
    { 
     if (Input.GetKeyDown("space")) 
     { 
      Use(); 
     } 
    } 
    **public abstract void** Use(); 
} 

public class GunController : ToolScript 
{ 
    public **override** void Use() 
    { 
     //Spawn bullet at this direction, this speed, give it spiral, tons of behavior etc. etc. 
    } 
    private void Update() 
    { 
     isActive(); 
    } 
} 

public class FlamethrowerController : ToolScript 
{ 
    public **override** void Use() 
    { 
     //Spawn fire at this direction, this speed, set tip of flamethrower to be red etc etc 
    } 
    private void Update() 
    { 
     isActive(); 
    } 
} 

étoiles ne sont pas dans le code et sont tout simplement pour mettre l'accent. Ce code a résolu mon problème.

+2

Vous pouvez déplacer la fonction Update() dans la classe ToolScript. De cette façon, vous n'avez pas besoin de le taper pour chaque classe enfant. Appelez isActive() à partir de là, et il appellera la fonction appropriée Use() dans la classe enfant. –