web-dev-qa-db-fra.com

Comment les getters et setters changent-ils les propriétés de Dart?

Je me bats avec le concept des getters et setters à Dart, et plus je lis, plus je ne peux pas comprendre l'objectif sous-jacent. Prenons par exemple le code suivant:

main() {
    Car car = new Car();
    car.doors = 44;
    print(car.doors);  // 44
}
class Car {
    int doors = 4;
}

Plus tard, je décide de faire des "portes" une variable privée, donc je fais ce qui suit:

main() {
    Car car = new Car();
    car.doors = 44;
    print(car.doors);  // 44
}
class Car {
    int _doors = 4;
    int get doors => _doors;
    set doors(int numberOfDoors) => _doors = numberOfDoors;
}

Selon le code, _doors est maintenant une variable privée, et je ne peux donc pas y accéder dans main (). Cependant, en manipulant doors, je peux indirectement changer la valeur de _doors, ce que je pensais vouloir éviter en premier lieu en en faisant une variable privée. Quel est donc le but de transformer une variable précédemment publique en variable privée, si vous pouvez toujours la manipuler indirectement? Et, comment les getters et setters travaillent-ils même pour changer les propriétés de ces variables? J'essaie de comprendre le concept fondamental, car sans cela, je ne comprends pas comment ni pourquoi les getters et setters sont utilisés.

24
rchkm

Les variables d'instance dans Dart ont des getters et setters implicites. Donc, pour votre exemple de code, il fonctionnera exactement de la même manière, car tout ce que vous avez fait est passé d'un getter et setter implicite à un getter et setter explicite.

La valeur des getters et setters explicites est que vous n'avez pas besoin de définir les deux si vous ne le souhaitez pas. Par exemple, nous pouvons changer votre exemple pour définir uniquement un getter:

main() {
    Car car = new Car();
    print(car.doors);  // 4
    car.doors = 6; // Won't work since no doors setter is defined
}

class Car {
    int _doors = 4;
    int get doors => _doors;
}

De plus, vous pouvez également ajouter une logique supplémentaire dans un getter ou un setter que vous n'obtenez pas dans un getter ou un setter implicite:

class Car {
    int _doors = 4;
    int get doors => _doors;
    set doors(int numberOfDoors) {
      if(numberOfDoors >= 2 && numberOfDoors <= 6) {
        _doors = numberOfDoors;
      }
    }
}
50
Pixel Elephant

Les fonctions getter et setter nous permettent de faire en sorte que la classe apparaisse ait une propriété, sans qu'une propriété explicite ne soit déclarée (_doors dans ton cas). La valeur de la propriété peut être calculée à partir d'autres propriétés.

Les getters et setters nous permettent d'exécuter du code arbitraire lorsque la propriété est récupérée ou définie.

L'omission d'un passeur rend la propriété immuable.

Une classe abstraite peut déclarer des getters et setters sans corps dans le cadre d'une interface de classe requise.

2
Argenti Apparatus