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); // 2Zmienna 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ę.
Wyzwanie
ŁatwyZbudujmy 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ątkowej0, która śledzi liczbę osób, które odwiedziły tę konkretną wystawę - Zmienną statyczną
totalVisitors(int) o wartości początkowej0, która śledzi łączną liczbę wizyt na wszystkich wystawach - Konstruktor, który przyjmuje nazwę wystawy
- Metodę
recordVisit(), która zwiększa zarównovisitorCountwystawy, jak itotalVisitorsklasy - Metodę
displayStats(), która wyświetla informacje o wystawie
- Zmienną instancji
main.dart: Zaimportuj klasę wystawy i utwórz dwie wystawy:- Wystawę
'Dinosaur Bones' - Wystawę
'Ancient Egypt'
displayStats()dla każdej wystawy w kolejności, w jakiej zostały utworzone, a następnie wyświetl łączną liczbę odwiedzających wszystkie wystawy.- Wystawę
Metoda displayStats() powinna wyświetlać informacje w dokładnie takim formacie:
[name]: [visitorCount] visitorsW 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: 5Spró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]
}
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