Klasy abstrakcyjne
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 43 z 110.
Klasa abstrakcyjna to klasa, której nie można bezpośrednio instancjonować. Służy jako szablon dla innych klas, definiując wspólną strukturę, której muszą przestrzegać podklasy. Tworzysz ją za pomocą słowa kluczowego abstract.
abstract class Shape {
String color;
Shape(this.color);
void describe() {
print('A $color shape');
}
}
class Circle extends Shape {
double radius;
Circle(String color, this.radius) : super(color);
}
void main() {
// Shape s = Shape('red'); // Błąd! Nie można utworzyć instancji klasy abstrakcyjnej
var circle = Circle('blue', 5.0);
circle.describe(); // Niebieska figura
}Klasy abstrakcyjne są przydatne, gdy masz do czynienia z pojęciem zbyt ogólnym, by mogło istnieć samodzielnie. „Kształt” to pojęcie, ale nie możesz narysować kształtu, nie wiedząc, czy jest to koło, prostokąt czy trójkąt. Klasa abstrakcyjna definiuje to, co jest wspólne dla wszystkich kształtów, a podklasy konkretne dostarczają szczegółowych informacji.
Zauważ, że klasy abstrakcyjne mogą nadal mieć zwykłe metody z implementacjami (takie jak describe()) i konstruktory. Podklasy dziedziczą je tak samo jak przy zwykłym dziedziczeniu. Kluczowa różnica polega po prostu na tym, że nie możesz utworzyć instancji samej klasy abstrakcyjnej — musisz użyć konkretnej podklasy.
Wyzwanie
ŁatwyZbudujmy system pojazdów, który pokazuje, jak klasy abstrakcyjne służą jako szablony dla bardziej szczegółowych typów. Utworzysz abstrakcyjną klasę bazową, która definiuje cechy wspólne dla wszystkich pojazdów, a następnie rozszerzysz ją o konkretne typy pojazdów.
Podzielisz swój kod na dwa pliki:
vehicle.dart: Zdefiniuj tutaj hierarchię pojazdów:- Utwórz
abstract class Vehiclez właściwościamiString brandiint year. Dodaj konstruktor, który przyjmuje obie wartości, oraz metodędisplayInfo(), która wyświetla[brand] ([year]) - Utwórz klasę
Car, która rozszerzaVehiclei dodaje właściwośćint doors. Dodaj metodęhonk(), która wyświetlaBeep beep! - Utwórz klasę
Motorcycle, która rozszerzaVehiclei dodaje właściwośćbool hasSidecar. Dodaj metodęrevEngine(), która wyświetlaVroom!
- Utwórz
main.dart: Zaimportuj plik z pojazdami i pokaż, jak działają klasy abstrakcyjne:- Utwórz obiekt
Caro marce'Toyota', roku2022i liczbie drzwi4 - Wywołaj jego metodę
displayInfo()(odziedziczoną po Vehicle) - Wyświetl
Doors: [doors] - Wywołaj jego metodę
honk() - Wyświetl pustą linię
- Utwórz obiekt
Motorcycleo marce'Harley', roku2021i wartości hasSidecarfalse - Wywołaj jego metodę
displayInfo() - Wyświetl
Has sidecar: [hasSidecar] - Wywołaj jego metodę
revEngine()
- Utwórz obiekt
Pamiętaj, że nie możesz bezpośrednio utworzyć instancji Vehicle, ponieważ jest to klasa abstrakcyjna — musisz użyć jednej z konkretnych podklas. Zarówno Car, jak i Motorcycle dziedziczą metodę displayInfo() po abstrakcyjnej klasie nadrzędnej.
Oczekiwany wynik:
Toyota (2022)
Doors: 4
Beep beep!
Harley (2021)
Has sidecar: false
Vroom!Spróbuj swoich sił
import 'vehicle.dart';
void main() {
// TODO: Utwórz obiekt Car marki 'Toyota', z rokiem produkcji 2022 i 4 drzwiami
// TODO: Wywołaj displayInfo() dla samochodu
// TODO: Wypisz "Doors: [doors]"
// TODO: Wywołaj honk() dla samochodu
// TODO: Wypisz pustą linię
// TODO: Utwórz obiekt Motorcycle marki 'Harley', z rokiem produkcji 2021 i hasSidecar ustawionym na false
// TODO: Wywołaj displayInfo() dla motocykla
// TODO: Wypisz "Has sidecar: [hasSidecar]"
// TODO: Wywołaj revEngine() dla motocykla
}
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