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
}