Konstruktory stałe
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 13 z 110.
Konstruktor stały tworzy obiekty będące stałymi czasu kompilacji. Gdy tworzysz obiekty o tych samych wartościach za pomocą konstruktora const, Dart ponownie używa tej samej instancji w pamięci, co poprawia wydajność.
Aby utworzyć konstruktor stały, dodaj słowo kluczowe const przed nazwą konstruktora i upewnij się, że wszystkie zmienne instancji są final:
class Color {
final int red;
final int green;
final int blue;
const Color(this.red, this.green, this.blue);
}
const white = Color(255, 255, 255);
const alsoWhite = Color(255, 255, 255);
print(identical(white, alsoWhite)); // trueZarówno white, jak i alsoWhite wskazują na dokładnie ten sam obiekt w pamięci, ponieważ zostały utworzone z identycznymi wartościami za pomocą konstruktora stałego.
Możesz także używać konstruktorów const bez słowa kluczowego const, co tworzy zwykłe (niebędące stałymi) instancje:
var red = Color(255, 0, 0); // Zwykła instancja
const blue = Color(0, 0, 255); // Stała instancjaKonstruktory stałe są powszechnie używane w przypadku niezmiennych obiektów konfiguracyjnych, predefiniowanych wartości, takich jak kolory lub rozmiary, oraz wszędzie tam, gdzie chcesz zagwarantować niezmienność obiektów, optymalizując jednocześnie wykorzystanie pamięci.
Wyzwanie
ŁatwyZbudujmy system konfiguracji prostej gry, który wykorzystuje konstruktory stałe do definiowania niezmiennych, wielokrotnego użytku ustawień.
Utworzysz dwa pliki, aby uporządkować swój kod:
difficulty.dart: Zdefiniuj klasęDifficulty, która reprezentuje ustawienia poziomu trudności gry. Twoja klasa powinna mieć:- Trzy pola
final:name(String),enemyCount(int) iplayerLives(int) - Konstruktor stały, który inicjalizuje wszystkie trzy pola
- Metodę
display(), która wyświetla informacje o poziomie trudności
- Trzy pola
main.dart: Zaimportuj klasę poziomu trudności i utwórz trzy stałe ustawienia poziomu trudności:easyz nazwą'Easy',5przeciwnikami i5życiamimediumz nazwą'Medium',10przeciwnikami i3życiamihardz nazwą'Hard',20przeciwnikami i1życiem
const. Następnie wywołajdisplay()dla każdej z nich, w kolejności podanej powyżej. Na koniec sprawdź za pomocąidentical(), czy dwa obiektyconst Difficulty('Easy', 5, 5)są identyczne, i wyświetl wynik.
Metoda display() powinna wyświetlać tekst w dokładnie takim formacie:
[name]: [enemyCount] enemies, [playerLives] livesOczekiwany wynik:
Easy: 5 enemies, 5 lives
Medium: 10 enemies, 3 lives
Hard: 20 enemies, 1 lives
trueSpróbuj swoich sił
import 'difficulty.dart';
void main() {
// TODO: Utwórz trzy stałe ustawienia poziomu trudności, używając słowa kluczowego const:
// - easy: nazwa 'Easy', 5 enemies, 5 lives
// - medium: nazwa 'Medium', 10 enemies, 3 lives
// - hard: nazwa 'Hard', 20 wrogów, 1 życie
// TODO: Wywołaj display() dla każdego poziomu trudności w kolejności: easy, medium, hard
// TODO: Sprawdź, czy dwa obiekty const Difficulty('Easy', 5, 5) są identyczne
// za pomocą identical() i wypisz wynik
}
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