Menu
Coddy logo textTech

Elementy instancji a elementy statyczne

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 17 z 110.

W klasach Dart elementy składowe (zmienne i metody) mogą należeć do poszczególnych obiektów albo do samej klasy. Zrozumienie tej różnicy ma podstawowe znaczenie dla efektywnego organizowania kodu.

Elementy instancji należą do każdego utworzonego obiektu. Każdy obiekt ma własną kopię zmiennych instancji, a metody instancji operują na danych konkretnego obiektu:

class Dog {
  String name;  // Zmienna instancji
  
  Dog(this.name);
  
  void bark() {  // Metoda instancji
    print('$name says woof!');
  }
}

Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');

dog1.bark();  // Buddy mówi hau!
dog2.bark();  // Max mówi hau!

Każdy obiekt Dog ma własną name. Zmiana imienia jednego psa nie wpływa na drugiego.

Elementy statyczne należą do samej klasy, a nie do konkretnego obiektu. Są współdzielone przez wszystkie instancje i dostępne za pomocą nazwy klasy:

class Dog {
  String name;
  static int totalDogs = 0;  // Zmienna statyczna
  
  Dog(this.name) {
    totalDogs++;
  }
}

Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');

print(Dog.totalDogs);  // 2

Zmienna totalDogs jest współdzielona — istnieje tylko jedna jej kopia, niezależnie od liczby obiektów Dog. Dostęp do niej uzyskujesz przez nazwę klasy Dog.totalDogs, a nie przez instancję.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system liczenia odwiedzających muzeum, który śledzi zarówno wizyty na poszczególnych wystawach, jak i ogólne statystyki muzeum.

Podzielisz swój kod na dwa pliki:

  • exhibit.dart: Zdefiniuj klasę Exhibit, która reprezentuje wystawę muzealną. Każda wystawa powinna mieć:
    • Zmienną instancji name (String) przechowującą nazwę wystawy
    • Zmienną instancji visitorCount (int) o wartości początkowej 0, która śledzi liczbę osób, które odwiedziły tę konkretną wystawę
    • Zmienną statyczną totalVisitors (int) o wartości początkowej 0, która śledzi łączną liczbę wizyt na wszystkich wystawach
    • Konstruktor, który przyjmuje nazwę wystawy
    • Metodę recordVisit(), która zwiększa zarówno visitorCount wystawy, jak i totalVisitors klasy
    • Metodę displayStats(), która wyświetla informacje o wystawie
  • main.dart: Zaimportuj klasę wystawy i utwórz dwie wystawy:
    • Wystawę 'Dinosaur Bones'
    • Wystawę 'Ancient Egypt'
    Zarejestruj 3 wizyty na wystawie Dinosaur Bones, a następnie zarejestruj 2 wizyty na wystawie Ancient Egypt. Po zarejestrowaniu wszystkich wizyt wywołaj displayStats() dla każdej wystawy w kolejności, w jakiej zostały utworzone, a następnie wyświetl łączną liczbę odwiedzających wszystkie wystawy.

Metoda displayStats() powinna wyświetlać informacje w dokładnie takim formacie:

[name]: [visitorCount] visitors

W wierszu z łączną liczbą odwiedzających wyświetl:

Total museum visitors: [totalVisitors]

Uzyskaj dostęp do zmiennej statycznej, używając nazwy klasy Exhibit.totalVisitors.

Oczekiwany wynik:

Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5

Spróbuj swoich sił

import 'exhibit.dart';

void main() {
  // TODO: Utwórz wystawę 'Dinosaur Bones'
  
  // TODO: Utwórz wystawę 'Ancient Egypt'
  
  // TODO: Zarejestruj 3 wizyty na wystawie Dinosaur Bones
  
  // TODO: Zarejestruj 2 wizyty na wystawie Ancient Egypt
  
  // TODO: Wywołaj displayStats() kolejno dla każdej wystawy
  
  // TODO: Wypisz łączną liczbę odwiedzających muzeum, używając Exhibit.totalVisitors
  // Format: Total museum visitors: [totalVisitors]
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online