Sobes.tech
Junior

Mi a különbség az Abstract és a late kulcsszavak között a Dartban?

sobes.tech MI

Válasz az MI-től

Az Abstract az absztrakt osztályok létrehozására szolgál, amelyeket nem lehet közvetlenül példányosítani. Egy absztrakt osztály tartalmazhat megvalósított és absztrakt (megvalósítás nélküli) metódusokat is. Az absztrakt metódusokat nem absztrakt alosztályokban kell megvalósítani.

A late késleltetett inicializálásra szolgál változók esetében. A late-ként jelölt változó garantáltan inicializálva lesz az első használat előtt. Ha egy late-ként jelölt változót nem inicializálnak az első hozzáférés előtt, futási időben hiba lép fel. Ez hasznos olyan változók inicializálásához, amelyek értéke más változóktól vagy a deklarálás utáni logikától függ.

Tulajdonság Abstract late
Alkalmazásra Osztályokra Változókra
Cél Szerződés, sablon definiálása Késleltetett inicializálás
Példányosítás Nem lehetséges közvetlenül Lehetséges
Kötelező Megvalósítás alosztályokban (absztrakt metódusok esetén) Inicializálás az első használat előtt

Példa abstract-re:

// Absztrakt osztály definiálása
abstract class Shape {
  // Absztrakt metódus
  double getArea();

  // Megvalósított metódus
  void printName() {
    print("Ez egy alakzat");
  }
}

// Absztrakt osztály implementálása
class Circle extends Shape {
  double radius;

  Circle(this.radius);

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

// Shape példányosítása nem lehetséges:
// var shape = Shape(); // Hiba

Példa late-re:

// Késleltetett inicializálással változó deklarálása
late String name;

void setupName() {
  // A változó inicializálása az első használat előtt
  name = "Flutter Developer";
}

void greet() {
  // A változó első használata az inicializálás után
  print("Hello, $name!");
}

void main() {
  setupName();
  greet(); // Kiírja: "Hello, Flutter Developer!"

  // Ha a greet() a setupName() előtt hívódik meg, futási időben hiba történne
  // greet(); // Hiba, ha a name nincs inicializálva
}