Interfejs Comparable
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 72 z 110.
Chociaż == informuje, czy dwa obiekty są równe, czasami musisz wiedzieć, który z nich jest pierwszy. Interfejs Comparable pozwala sortować obiekty przez zdefiniowanie naturalnego porządku.
Aby klasa mogła być porównywana, zaimplementuj Comparable<T> i nadpisz metodę compareTo. Ta metoda zwraca liczbę ujemną, jeśli this występuje przed other, zero, jeśli są równe, i liczbę dodatnią, jeśli this występuje po other:
class Student implements Comparable<Student> {
String name;
int grade;
Student(this.name, this.grade);
@override
int compareTo(Student other) {
return grade.compareTo(other.grade);
}
}
void main() {
var students = [
Student('Alice', 85),
Student('Bob', 92),
Student('Carol', 78),
];
students.sort();
for (var s in students) {
print('${s.name}: ${s.grade}');
}
// Carol: 78, Alice: 85, Bob: 92
}Gdy Twoja klasa implementuje Comparable, możesz użyć sort() bez podawania własnego komparatora. Wbudowane typy liczbowe i łańcuchów znaków już implementują Comparable, dlatego grade.compareTo(other.grade) działa bezpośrednio.
Aby uzyskać kolejność malejącą, po prostu odwróć porównanie, zamieniając obiekty miejscami lub negując wynik:
@override
int compareTo(Student other) {
return other.grade.compareTo(grade); // Malejąco
}Wyzwanie
ŁatwyZbudujmy system zarządzania zadaniami, w którym zadania można sortować według poziomu priorytetu! Utworzysz klasę Task, która implementuje interfejs Comparable, dzięki czemu lista zadań będzie automatycznie sortowana od najwyższego do najniższego priorytetu.
Podzielisz swój kod na dwa pliki:
task.dart: Utwórz klasęTask, która reprezentuje zadanie do wykonania, z właściwościaminame(String) ipriority(int, gdzie wyższe liczby oznaczają wyższy priorytet). Twoje zadanie powinno implementowaćComparable<Task>, aby po sortowaniu zadania pojawiały się w kolejności malejącej według priorytetu (najpierw zadanie o najwyższym priorytecie). Nadpisz takżetoString(), aby zwracała format:[name] (Priority: [priority])main.dart: Zaimportuj plik z zadaniami i pokaż, jak interfejsComparableumożliwia automatyczne sortowanie. Utwórz listę zawierającą te cztery zadania:'Write report'o priorytecie2'Fix critical bug'o priorytecie5'Update documentation'o priorytecie1'Review code'o priorytecie3
Before sorting:, a następnie wypisz każde zadanie. Posortuj listę za pomocąsort(), wypisz pustą linię, a następnie wypiszAfter sorting:, po którym ponownie wypisz każde zadanie.
Ponieważ klasa Task implementuje Comparable, możesz bezpośrednio wywołać sort() na liście, bez przekazywania własnego komparatora. Zadania zostaną automatycznie uporządkowane na podstawie implementacji compareTo!
Oczekiwany wynik:
Before sorting:
Write report (Priority: 2)
Fix critical bug (Priority: 5)
Update documentation (Priority: 1)
Review code (Priority: 3)
After sorting:
Fix critical bug (Priority: 5)
Review code (Priority: 3)
Write report (Priority: 2)
Update documentation (Priority: 1)Spróbuj swoich sił
import 'task.dart';
void main() {
// TODO: Utwórz listę obiektów Task zawierającą:
// - 'Write report' z priorytetem 2
// - 'Fix critical bug' z priorytetem 5
// - 'Update documentation' z priorytetem 1
// - 'Review code' z priorytetem 3
List<Task> tasks = [
// TODO: Dodaj tutaj cztery zadania
];
// TODO: Wypisz "Before sorting:"
// TODO: Wypisz każde zadanie z listy
// TODO: Posortuj listę za pomocą sort()
// TODO: Wypisz pusty wiersz
// TODO: Wypisz "After sorting:"
// TODO: Wypisz każde zadanie z posortowanej listy
}
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