Wat is het verschil tussen de sleutelwoorden Abstract en late in Dart?
sobes.tech AI
Antwoord van AI
Abstract wordt gebruikt om abstracte klassen te maken, die niet direct kunnen worden geïnstantieerd. Een abstracte klasse kan zowel geïmplementeerde als abstracte (zonder implementatie) methoden bevatten. Abstracte methoden moeten worden geïmplementeerd in niet-abstracte subclasses.
late wordt gebruikt voor deferred initialisatie van variabelen. Een variabele gemarkeerd als late zal gegarandeerd worden geïnitialiseerd vóór het eerste gebruik. Als een late-variabele niet wordt geïnitialiseerd vóór de eerste toegang, zal er een runtime-fout optreden. Dit is handig voor het initialiseren van variabelen waarvan de waarde afhankelijk is van andere variabelen of logica die na de declaratie wordt uitgevoerd.
| Eigenschap | Abstract | late |
|---|---|---|
| Toepassing op | Klassen | Variabelen |
| Doel | Definieert een contract, sjabloon | Uitgestelde initialisatie |
| Instantiering | Niet direct mogelijk | Mogelijk |
| Verplichting | Implementaties in subclasses (voor abstracte methoden) | Initialisatie vóór eerste gebruik |
Voorbeeld van abstract:
// Definitie van een abstracte klasse
abstract class Shape {
// Abstracte methode
double getArea();
// Geïmplementeerde methode
void printName() {
print("Dit is een figuur");
}
}
// Implementatie van de abstracte klasse
class Circle extends Shape {
double radius;
Circle(this.radius);
@override
double getArea() {
return 3.14 * radius * radius;
}
}
// Je kunt geen instantie van Shape maken:
// var shape = Shape(); // Fout
Voorbeeld van late:
// Declaratie van een variabele met uitgestelde initialisatie
late String name;
void setupName() {
// Initialisatie van de variabele vóór het eerste gebruik
name = "Flutter Developer";
}
void greet() {
// Eerste gebruik van de variabele na initialisatie
print("Hello, $name!");
}
void main() {
setupName();
greet(); // Zal "Hello, Flutter Developer!" afdrukken
// Als greet() werd aangeroepen vóór setupName(), zou er een runtime-fout optreden
// greet(); // Fout als name niet geïnitialiseerd is
}