Sobes.tech
Junior

Jaka jest różnica między słowami kluczowymi Abstract i late w Dart?

sobes.tech AI

Odpowiedź od AI

Abstract jest używany do tworzenia klas abstrakcyjnych, które nie mogą być bezpośrednio instancjonowane. Klasa abstrakcyjna może zawierać zarówno zaimplementowane, jak i abstrakcyjne (bez implementacji) metody. Metody abstrakcyjne muszą być zaimplementowane w nieabstrakcyjnych podklasach.

late jest używany do opóźnionej inicjalizacji zmiennych. Zmienna oznaczona jako late będzie gwarantowanie zainicjalizowana przed jej pierwszym użyciem. Jeśli zmienna zadeklarowana jako late nie zostanie zainicjalizowana przed jej pierwszym odwołaniem, wystąpi błąd w czasie wykonywania. Jest to przydatne do inicjalizacji zmiennych, których wartości zależą od innych zmiennych lub logiki wykonywanej po deklaracji.

Właściwość Abstract late
Zastosowanie do Klas Zmiennych
Cel Określa kontrakt, szablon Opóźniona inicjalizacja
Tworzenie instancji Niemożliwe bezpośrednio Możliwe
Obowiązkowość Implementacje w podklasach (dla metod abstrakcyjnych) Inicjalizacja przed pierwszym użyciem

Przykład abstract:

// Definicja klasy abstrakcyjnej
abstract class Shape {
  // Metoda abstrakcyjna
  double getArea();

  // Zaimplementowana metoda
  void printName() {
    print("To jest figura");
  }
}

// Implementacja klasy abstrakcyjnej
class Circle extends Shape {
  double radius;

  Circle(this.radius);

  @override
  double getArea() {
    return 3.14 * radius * radius;
  }
}

// Nie można utworzyć instancji Shape:
// var shape = Shape(); // Błąd

Przykład late:

// Deklaracja zmiennej z opóźnioną inicjalizacją
late String name;

void setupName() {
  // Inicjalizacja zmiennej przed pierwszym użyciem
  name = "Flutter Developer";
}

void greet() {
  // Pierwsze użycie zmiennej name po inicjalizacji
  print("Hello, $name!");
}

void main() {
  setupName();
  greet(); // Wyświetli "Hello, Flutter Developer!"

  // Gdyby greet() został wywołany przed setupName(), wystąpiłby błąd w czasie wykonywania
  // greet(); // Błąd, jeśli name nie został zainicjalizowany
}