Junior
Jaký je rozdíl mezi klíčovými slovy Abstract a late v Dart?
sobes.tech AI
Odpověď od AI
Abstract se používá k vytváření abstraktních tříd, které nelze přímo instancovat. Abstraktní třída může obsahovat jak implementované, tak abstraktní (bez implementace) metody. Abstraktní metody musí být implementovány v neabstraktních podtřídách.
late se používá pro odloženou inicializaci proměnných. Proměnná označená jako late bude zaručeně inicializována před svým prvním použitím. Pokud proměnná deklarovaná jako late není inicializována před prvním přístupem, dojde k chybě za běhu. To je užitečné pro inicializaci proměnných, jejichž hodnoty závisí na jiných proměnných nebo logice, která se provádí po deklaraci.
| Vlastnost | Abstract | late |
|---|---|---|
| Použití na | Třídách | Proměnných |
| Cíl | Definuje kontrakt, šablonu | Odložená inicializace |
| Instancování | Není možné přímo | Je možné |
| Povinnost | Implementace v podtřídách (pro abstraktní metody) | Inicializace před prvním použitím |
Příklad abstract:
// Definice abstraktní třídy
abstract class Shape {
// Abstraktní metoda
double getArea();
// Implementovaná metoda
void printName() {
print("Toto je tvar");
}
}
// Implementace abstraktní třídy
class Circle extends Shape {
double radius;
Circle(this.radius);
@override
double getArea() {
return 3.14 * radius * radius;
}
}
// Nelze vytvořit instanci Shape:
// var shape = Shape(); // Chyba
Příklad late:
// Deklarace proměnné s odloženou inicializací
late String name;
void setupName() {
// Inicializace proměnné před prvním použitím
name = "Flutter Developer";
}
void greet() {
// První použití proměnné name po inicializaci
print("Hello, $name!");
}
void main() {
setupName();
greet(); // Vypíše "Hello, Flutter Developer!"
// Pokud by bylo voláno greet() před setupName(), došlo by k chybě za běhu
// greet(); // Chyba, pokud name nebylo inicializováno
}