Metody i pola statyczne
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 20 z 110.
Teraz, gdy rozumiesz różnicę między składowymi instancji a składowymi statycznymi, przyjrzyjmy się, jak skutecznie korzystać ze statycznych metod i pól. Składowe statyczne świetnie sprawdzają się w przypadku funkcjonalności, która należy do samej koncepcji klasy, a nie do poszczególnych obiektów.
Pola statyczne przechowują dane współdzielone przez wszystkie instancje. Często używa się ich jako liczników, wartości konfiguracyjnych lub danych z pamięci podręcznej:
class MathHelper {
static const double pi = 3.14159;
static int calculationCount = 0;
static double circleArea(double radius) {
calculationCount++;
return pi * radius * radius;
}
}
print(MathHelper.circleArea(5)); // 78.53975
print(MathHelper.circleArea(3)); // 28.27431
print(MathHelper.calculationCount); // 2Zauważ, że wywołujesz metody statyczne bezpośrednio na nazwie klasy, a nie na jej instancji. Klasa MathHelper działa jak narzędzie — nigdy nie musisz tworzyć obiektu MathHelper.
Ważna zasada: metody statyczne nie mogą bezpośrednio uzyskiwać dostępu do składowych instancji. Nie mają dostępu do this, ponieważ nie są powiązane z żadnym konkretnym obiektem:
class Counter {
int value = 0; // Pole instancji
static int total = 0; // Pole statyczne
void increment() {
value++; // OK - metoda instancji uzyskuje dostęp do pola instancji
total++; // OK - metoda instancji może uzyskać dostęp do pola statycznego
}
static void reset() {
total = 0; // OK - metoda statyczna uzyskuje dostęp do pola statycznego
// value = 0; // Błąd! Nie można uzyskać dostępu do pola instancji
}
}Używaj elementów statycznych, gdy funkcjonalność nie zależy od stanu obiektu — funkcje narzędziowe, śledzenie fabryk lub współdzielone stałe to idealni kandydaci.
Wyzwanie
ŁatwyZbudujmy klasę narzędziową do operacji na ciągach znaków, która pokaże, jak metody i pola statyczne współpracują ze sobą, zapewniając przydatne funkcje bez konieczności tworzenia obiektów.
Utworzysz dwa pliki, aby uporządkować swój kod:
string_utils.dart: Zdefiniuj klasęStringUtils, która będzie pełnić funkcję pomocniczej klasy narzędziowej. Twoja klasa powinna zawierać:static const String defaultSeparatorustawione na'-'static int operationCountz początkową wartością0, aby śledzić liczbę wykonanych operacji- Metodę statyczną
reverse(String text), która zwiększa wartośćoperationCounti zwraca odwrócony ciąg znaków - Metodę statyczną
join(String first, String second), która zwiększa wartośćoperationCounti zwraca dwa ciągi znaków połączone za pomocądefaultSeparator - Metodę statyczną
countVowels(String text), która zwiększa wartośćoperationCounti zwraca liczbę samogłosek (a, e, i, o, u — bez rozróżniania wielkości liter) - Metodę statyczną
getStats(), która zwraca ciąg znaków zawierający łączną liczbę wykonanych operacji
main.dart: Zaimportuj swoją klasę narzędziową i użyj jej metod statycznych:- Wywołaj
reverse()z argumentem'hello'i wypisz wynik - Wywołaj
join()z argumentami'dart'i'lang'i wypisz wynik - Wywołaj
countVowels()z argumentem'Programming'i wypiszVowels: [count] - Wypisz statystyki za pomocą
getStats()
- Wywołaj
Pamiętaj, aby wywoływać wszystkie metody bezpośrednio na nazwie klasy, ponieważ są statyczne — nie będziesz tworzyć żadnych obiektów StringUtils.
Metoda getStats() powinna zwracać wynik w tym formacie:
Operations performed: [operationCount]Oczekiwany wynik:
olleh
dart-lang
Vowels: 3
Operations performed: 3Spróbuj swoich sił
import 'string_utils.dart';
void main() {
// TODO: Wywołaj reverse() z argumentem 'hello' i wypisz wynik
// TODO: Wywołaj join() z argumentami 'dart' i 'lang', a następnie wypisz wynik
// TODO: Wywołaj countVowels() z argumentem 'Programming' i wypisz "Vowels: [count]"
// TODO: Wypisz statystyki za pomocą getStats()
}
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