Nadpisanie toString()
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 70 z 110.
Gdy wyświetlasz obiekt w Dart, możesz zobaczyć coś w rodzaju Instance of 'Person' — niezbyt pomocnego. Dzieje się tak, ponieważ każda klasa dziedziczy domyślną metodę toString() z klasy Object, która zwraca tylko nazwę klasy.
Nadpisując toString(), możesz zapewnić czytelną tekstową reprezentację swoich obiektów:
class Person {
String name;
int age;
Person(this.name, this.age);
@override
String toString() {
return 'Person(name: $name, age: $age)';
}
}
void main() {
var person = Person('Alice', 30);
print(person); // Person(name: Alice, age: 30)
}Bez nadpisania print(person) wyświetliłoby Instance of 'Person'. Dzięki temu uzyskujesz przydatne informacje o stanie obiektu.
Metoda toString() jest wywoływana automatycznie zawsze, gdy Dart musi przekonwertować Twój obiekt na ciąg znaków — w instrukcjach print(), interpolacji ciągów znaków lub podczas łączenia z innymi ciągami znaków:
var message = 'User: $person'; // toString() wywoływana automatycznie
print('Found: ' + person.toString()); // Jawne wywołanieDobrze zaimplementowana metoda toString() znacznie ułatwia debugowanie, ponieważ pozwala szybko sprawdzać wartości obiektów podczas programowania.
Wyzwanie
ŁatwyZbudujmy system katalogu produktów, w którym każdy produkt po wydrukowaniu wyświetla swoje informacje w przejrzystym, czytelnym formacie. Poćwiczysz nadpisywanie metody toString(), aby obiekty były łatwiejsze do debugowania i bardziej przyjazne dla użytkownika.
Podzielisz swój kod na dwa pliki:
product.dart: Utwórz klasęProduct, która reprezentuje produkt w sklepie. Twój produkt powinien miećname(String),price(double) iquantity(int). Nadpisz metodętoString(), aby zwracała sformatowany ciąg znaków dokładnie w tym formacie:Product(name: [name], price: $[price], qty: [quantity])main.dart: Zaimportuj plik produktu i pokaż, jak nadpisanie metodytoString()sprawia, że drukowanie obiektów jest znacznie bardziej przydatne. Utwórz trzy produkty i wydrukuj je, aby zobaczyć w działaniu własną reprezentację tekstową:- Produkt o nazwie
'Laptop', cenie999.99i ilości5 - Produkt o nazwie
'Mouse', cenie29.5i ilości50 - Produkt o nazwie
'Keyboard', cenie75.0i ilości30
Featured: [product], używając produktu Laptop.- Produkt o nazwie
Zwróć uwagę, że bezpośrednie wydrukowanie każdego produktu wyświetla przydatne informacje zamiast mało pomocnego komunikatu Instance of 'Product'. Metoda toString() jest wywoływana automatycznie zarówno w instrukcjach print(), jak i podczas interpolacji ciągów znaków.
Oczekiwany wynik:
Product(name: Laptop, price: $999.99, qty: 5)
Product(name: Mouse, price: $29.5, qty: 50)
Product(name: Keyboard, price: $75.0, qty: 30)
Featured: Product(name: Laptop, price: $999.99, qty: 5)Spróbuj swoich sił
import 'product.dart';
void main() {
// TODO: Utwórz trzy instancje Product:
// 1. Laptop - cena: 999.99, ilość: 5
// 2. Mouse - cena: 29.5, ilość: 50
// 3. Keyboard - cena: 75.0, ilość: 30
// TODO: Wypisz każdy produkt (toString() zostanie wywołane automatycznie)
// TODO: Wypisz komunikat o wyróżnionym produkcie, używając interpolacji ciągów znaków
// Format: Featured: [produkt laptop]
}
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