Gettery i settery
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 21 z 110.
Gettery i settery umożliwiają dostęp do pól klasy i ich modyfikowanie za pomocą specjalnych metod, które wyglądają jak zwykłe właściwości. Zamiast udostępniać pola bezpośrednio, możesz kontrolować sposób odczytywania i zapisywania wartości.
Getter definiuje się za pomocą słowa kluczowego get i zwraca obliczoną lub zapisaną wartość:
class Rectangle {
double width;
double height;
Rectangle(this.width, this.height);
double get area => width * height;
double get perimeter => 2 * (width + height);
}
Rectangle rect = Rectangle(5, 3);
print(rect.area); // 15.0
print(rect.perimeter); // 16.0Zauważ, że do area i perimeter odwołujesz się jak do pól, ale są one obliczane za każdym razem. Nie są potrzebne nawiasy.
Setter używa słowa kluczowego set i pozwala kontrolować sposób przypisywania wartości:
class Temperature {
double _celsius;
Temperature(this._celsius);
double get celsius => _celsius;
set celsius(double value) {
if (value >= -273.15) {
_celsius = value;
}
}
double get fahrenheit => _celsius * 9 / 5 + 32;
set fahrenheit(double value) {
celsius = (value - 32) * 5 / 9;
}
}
Temperature temp = Temperature(25);
print(temp.fahrenheit); // 77.0
temp.fahrenheit = 100;
print(temp.celsius); // 37.78Setter sprawdza poprawność danych wejściowych przed ich zapisaniem, a nawet może konwertować jednostki. Dzięki temu masz kontrolę nad swoimi danymi, zachowując jednocześnie przejrzystą składnię przypominającą właściwości dla użytkowników swojej klasy.
Wyzwanie
ŁatwyZbudujmy licznik punktów do gry, który wykorzystuje gettery i settery do zarządzania statystykami gracza, z walidacją i obliczanymi wartościami.
Podzielisz swój kod na dwa pliki:
player.dart: Zdefiniuj klasęPlayer, która śledzi wyniki gracza w grze. Twoja klasa powinna zawierać:- Pole
String nameprzechowujące imię gracza - Prywatne pole
int _scoreo wartości początkowej0 - Prywatne pole
int _liveso wartości początkowej3 - Konstruktor przyjmujący imię gracza
- Getter
score, który zwraca aktualny wynik - Setter
score, który akceptuje tylko wartości równe0lub większe (ignoruj wartości ujemne) - Getter
lives, który zwraca aktualną liczbę żyć - Setter
lives, który akceptuje tylko wartości z przedziału od0do5włącznie (ignoruj wartości spoza tego przedziału) - Getter
level, który oblicza poziom gracza na podstawie wyniku: wynik podzielony przez100(dzielenie całkowite), plus1 - Getter
isAlive, który zwracatrue, jeśli liczba żyć jest większa niż0 - Metodę
displayStatus(), która wypisuje aktualny status gracza
- Pole
main.dart: Zaimportuj klasę gracza i pokaż działanie getterów i setterów:- Utwórz gracza o imieniu
'Alex' - Ustaw wynik na
250i wywołajdisplayStatus() - Spróbuj ustawić wynik na
-50(powinien zostać zignorowany) i wywołajdisplayStatus() - Ustaw liczbę żyć na
1i wywołajdisplayStatus() - Spróbuj ustawić liczbę żyć na
10(powinna zostać zignorowana) i wywołajdisplayStatus()
- Utwórz gracza o imieniu
Metoda displayStatus() powinna wypisywać tekst w dokładnie takim formacie:
[name] | Score: [score] | Level: [level] | Lives: [lives] | Alive: [isAlive]Oczekiwany wynik:
Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: trueSpróbuj swoich sił
import 'player.dart';
void main() {
// TODO: Utwórz gracza o imieniu 'Alex'
// TODO: Ustaw wynik na 250 i wywołaj displayStatus()
// TODO: Spróbuj ustawić wynik na -50 (ta wartość powinna zostać zignorowana) i wywołaj displayStatus()
// TODO: Ustaw liczbę żyć na 1 i wywołaj displayStatus()
// TODO: Spróbuj ustawić liczbę żyć na 10 (ta wartość powinna zostać zignorowana) i wywołaj displayStatus()
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online