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
}