Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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 Vehicle z właściwościami String brand i int year. Dodaj konstruktor, który przyjmuje obie wartości, oraz metodę displayInfo(), która wyświetla [brand] ([year])
    • Utwórz klasę Car, która rozszerza Vehicle i dodaje właściwość int doors. Dodaj metodę honk(), która wyświetla Beep beep!
    • Utwórz klasę Motorcycle, która rozszerza Vehicle i dodaje właściwość bool hasSidecar. Dodaj metodę revEngine(), która wyświetla Vroom!
  • main.dart: Zaimportuj plik z pojazdami i pokaż, jak działają klasy abstrakcyjne:
    • Utwórz obiekt Car o marce 'Toyota', roku 2022 i liczbie drzwi 4
    • Wywołaj jego metodę displayInfo() (odziedziczoną po Vehicle)
    • Wyświetl Doors: [doors]
    • Wywołaj jego metodę honk()
    • Wyświetl pustą linię
    • Utwórz obiekt Motorcycle o marce 'Harley', roku 2021 i wartości hasSidecar false
    • Wywołaj jego metodę displayInfo()
    • Wyświetl Has sidecar: [hasSidecar]
    • Wywołaj jego metodę revEngine()

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
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online