Composition de classe en Objective-C Question: Est-il possible d'hériter d'une variable de classe?

StackOverflow https://stackoverflow.com/questions/1972727

  •  21-09-2019
  •  | 
  •  

Question

Pour aider à recueillir un sens de l'Objective-C Je crée un très de base de connexion 4 jeu sans cacao.

Dans mon programme, j'ai trois modules:

        
  • « jeu »: Contient un tableau qui contient les informations de la carte. Objet qui est créé dans le principal, et est responsable de la tour. Player et objets informatiques vivent dans ce module.
  •     
  • « Player ». Contient une fonction qui insère la pièce d'un joueur dans la colonne préférée (ce module existe dans le but d'encapsulation, et seulement)
  •     
  • « Ordinateur »: Contient des fonctions qui déterminent, en fonction de la configuration actuelle du conseil, où l'ordinateur doit se déplacer, et place ensuite une pièce à cet endroit
  • .

Idéalement, je voudrais que les classes Player et ordinateur pour pouvoir modifier la même instance de pieceLoc qui vit à l'intérieur du jeu par une sorte d'héritage, mais je ne suis pas sûr de savoir comment faire.

Voici un extrait de ce que je suis actuellement à penser à:
// startGame exists within the "Game" module

char *pieceLoc[42]; // This is a *temporary* global var. I'm still learning about
                    // the best way to implement this with class and instance 
                    // methods. This is the array that holds the board info.

-(void) startGame {
 Player   *player   =[[Player alloc] init]; // player's symbol = 'X'
 Computer *computer =[[Computer alloc] init]; // computer's symbol = 'O'

 int i = 0;
 while ([game hasPieceWon: 'X'] == NO && [game hasPieceWon: 'O'] == NO) {
  //function for player move

      if ([game hasPieceWon: 'X'] == NO) {
      //function for computer move
      } 
  }
 if ([game hasPieceWon: 'X'] == YES)
   // Tell the player they've won 
 else
  // Tell the player the computer has won.

}

Les fonctions utilisées pour les déplacements des joueurs et l'ordinateur sont les fonctions qui auraient besoin d'une certaine façon d'obtenir l'accès au pieceLoc du tableau (qui à l'avenir exister en tant que variable d'instance, une fois que j'apprends plus sur la classe par rapport à des méthodes d'instance). pieceLoc existe actuellement en tant que char *, au cas où je dois passer par l'intermédiaire des paramètres de fonction.

Je me sens comme si cela est un problème assez simple avec la façon dont je pense à la POO, mais je ne pouvais pas trouver une réponse à ce que je cherchais, malgré la recherche de la plupart des après-midi. D'après ce que j'ai rassemblé ma question concerne la composition des classes, mais je ne pouvais pas trouver une bonne ressource à ce sujet pour Objective-C.

Alors, encore une fois: Je suis à la recherche d'un moyen de passer une seule instance de pieceLoc qui vit au sein de « la classe parente » Jeu à deux « enfants des classes » où pieceLoc peut être manipulé directement sans à l'aide des paramètres supplémentaires.

Si passant le tableau en tant que paramètre ne finit par être la chose à faire idiomatiques, je serais en mesure d'obtenir un exemple de la façon dont le passage par des ouvrages de référence en Objective-C?

Merci pour l'aide!

Était-ce utile?

La solution

Comme vous l'avez probablement déjà compris, Objective-C n'a pas vraiment « variables de classe » que vous pouvez hériter d'une super-classe.

Une façon de construire ce de telle sorte que vous ne devez pas avoir variable globale serait quelque chose comme ceci:

Vous avez un objet de jeu qui contient des références à chacun des joueurs, et au Conseil. Les joueurs sont soit chaque initialisés avec une référence au Conseil. Votre méthode de startGame (dans le jeu) aurait du code comme ceci:

board = [[Board alloc] init];
player = [[Player alloc] initWithBoard: board];
computer = [[ComputerPlayer alloc] initWithBoard: board];

dans la classe de conseil, vous auriez des méthodes pour interroger l'état de la carte, faire un mouvement, déterminer si un mouvement est légal, et peut-être si un joueur ou non a gagné (si la logique lié au jeu de règles pourrait aller dans le jeu).

Dans les méthodes de initWithBoard dans le lecteur et ComputerPlayer, vous souhaitez simplement conserver l'instance du conseil d'administration, et l'utiliser pour communiquer les mouvements de chaque joueur décide de faire. Le jeu établirait l'ordre des mouvements, et de garder trace de tout état global. Lorsque le joueur et ComputerPlayer sont libérés à la fin du jeu, ils avaient libérer leur référence à la carte dans leur méthode dealloc.

Autres conseils

Depuis Objective-C n'a pas de variables de classe par-soi (ils sont simplement à l'aide de simuler des variables statiques), les classes d'enfants ne peuvent accéder directement aux GLOBALS statiques si vous définissez la méthode dans le même fichier source de / unité de compilation. Cela rompt les autres meilleures pratiques (une définition de classe par unité de compilation). L'approche habituelle des champs de classe d'accès est d'utiliser accesseurs.

Dans ce cas, faites attention à ne pas deux classes trop fermement. En passant la carte (comme un objet, pas un tableau) au Player (Person peut-être un meilleur nom, comme un ordinateur est aussi un lecteur) et Computer, que ce soit en tant que paramètre de méthode ou une propriété, est plus souple que se référant à une global ou à un membre statique d'une autre classe. Les objets de joueurs décident où placer, puis dire la carte où placer la pièce. Sinon, le jeu passe une version en lecture seule de la carte à un joueur; La méthode de placement du joueur retourne où placer un morceau. D'une part, le découplage et l'aide d'un objet carte peut empêcher la tricherie. Imaginez que quelqu'un injecte leur propre classe de joueur qui leur permet de placer plusieurs pièces à leur tour. D'autre part, l'indirection il est plus facile d'ajouter le support de réseau (messages entre les objets deviennent des messages du réseau dans un processus transparent aux objets locaux).

Pensez aussi sur l'endroit où les joueurs sont créés. Il serait plus logique d'avoir quelque chose d'autre créer les joueurs et les transmettre à la méthode de startGame. Cela serait logique si les joueurs étaient en compétition dans un tournoi, par exemple, et les objets du joueur ainsi besoin d'exister plus longtemps qu'un seul jeu.

Composition de la classe se réfère à un objet ayant une autre qualité de membre. C, par exemple, ne prend pas en charge l'héritage, mais laissez-vous structs nid. Une autre façon de dire est que la composition de classe est d'environ « a-un » relations, alors que l'héritage est sur le point « est-un » relations. Les classes de joueurs, par exemple, pourrait avoir un pointeur sur la carte, chacun utilise pour placer les pièces.

Objective-C ne passe pas non plus par référence. Il utilise plutôt des pointeurs.

Aussi, assurez-vous que votre jeu gère les liens. Vous pouvez simplifier la boucle de jeu pour y parvenir. En pseudocode,

// nextPlayer returns 'nil' if game is over (win or tie)
while currPlayer := [game nextPlayer]:
    // player will tell board where to place piece
    [currPlayer move]

Ou:

// nextPlayer always returns a valid player
while currPlayer := [game nextPlayer]:
    // player's method returns what and where to place
    [self place:[currPlayer move] for:currPlayer]
    // explicitly test for game end, which includes wins & ties
    if [game isOver]:
        break
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top