Variable privée - Cours POO

Bonjour à tous.
Dans le cours de Maxime sur l’encapsulation en POO les variables sont mis en privée. Lors de l’exercice « Notion d’armes partie 1 » ses variables sont initialisées etc … et il n’a aucun message d’erreur sur le pseudo alors que de mon côté oui …
Je ne comprend pas …
Merci

T’as essayé en la déclarant avec un VAR, plutôt qu’un LET ?

Perso, j’aurais initialisé pseudo au début, avec une chaîne vide.

EDIT : J’ai tapé un petit test pour reproduire ton problème :

class Player {
  private let pseudo : String
  private var force = 2
  
  init (pseudo:String) {
    self.pseudo = pseudo
  }
  
}

Et ça marche parfaitement ! (Xcode 12.1). Je vais reprendre ton code en entier, pour voir.

EDIT 2 :

import Foundation

class Player {
  private let pseudo : String
  private var _force = 2
  private var pointsVie = 100
  
  var force : Int { _force }
  var vivant: Bool { pointsVie > 0 }
  
  init (pseudo:String) {
    self.pseudo = pseudo
  }
  
  func afficherEtat() {
    print("""
      Pseudo : \(self.pseudo)
      Force : \(self._force)
      Points de Vie : \(self.pointsVie)%
      """)
  }
  
}

Aucun problème de compilation ! Tu as peut-être fait une erreur de frappe, ajoutant un caractère invisible à un nom de variable. Tu devrais créer une classe Player2, avec juste une variable private pseudo et voir ce qui se passe.


Sinon, une remarque sur la manière d’écrire le code : soit tu met un symbole _ devant toutes les variables private (ce que je recommande), soit tu ne le fait pas. Mélanger les styles de notation dans le code, le rend illisible.

EDIT 3 : En y repensant, le problème vient peut-être de la nature de ton application. C’est une application purement console, non ?

J’ai fait mes tests en incluant la classe Player dans une application SwiftUI (depuis MS-DOS j’ai une profonde haine pour toutes les applications consoles, que j’évite au maximum).

Le problème vient peut-être de la classe Main de ton projet, et non de la classe Player.


EDIT 4 :
C’est évident en fait (j’ai mal dormi, j’aurais du le voir tout de suite). Ta classe Player ne donne aucun accès au contenu privé de Pseudo. Tu as tapé des interfaces pour la force et l’état du joueur, mais pas pour son pseudo.

Il faut écrire quelque chose comme :

import Foundation

    class Player {
      private let _pseudo : String
      private var _force = 2
      private var _pointsVie = 100
      
      // Interfaces entre les variables privées
      // et les objets utilisant la classe Player
      var force : Int { _force }
      var vivant: Bool { _pointsVie > 0 }
      var pseudo: String { _pseudo }
      
      // Initialisation classe
      init (pseudo:String) {
        self._pseudo = pseudo
      }
      
    }
1 J'aime

Ben écoute un grand merci Drake je vais essayer ceci.