Junior
Qual é a diferença entre as palavras-chave Abstract e late em Dart?
sobes.tech IA
Resposta da IA
Abstract é usado para criar classes abstratas, que não podem ser instanciadas diretamente. Uma classe abstrata pode conter métodos implementados e métodos abstratos (sem implementação). Os métodos abstratos devem ser implementados nas subclasses não abstratas.
late é usado para inicialização diferida de variáveis. Uma variável marcada como late será garantidamente inicializada antes do seu primeiro uso. Se uma variável declarada como late não for inicializada antes do seu primeiro acesso, ocorrerá um erro em tempo de execução. Isto é útil para inicializar variáveis cujo valor depende de outras variáveis ou lógica que é executada após a declaração.
| Propriedade | Abstract | late |
|---|---|---|
| Aplicação a | Classes | Variáveis |
| Objetivo | Define um contrato, modelo | Inicialização diferida |
| Instanciação | Não é possível diretamente | É possível |
| Obrigatoriedade | Implementações em subclasses (para métodos abstratos) | Inicialização antes do primeiro uso |
Exemplo de abstract:
// Definição de classe abstrata
abstract class Shape {
// Método abstrato
double getArea();
// Método implementado
void printName() {
print("Isto é uma figura");
}
}
// Implementação de classe abstrata
class Circle extends Shape {
double radius;
Circle(this.radius);
@override
double getArea() {
return 3.14 * radius * radius;
}
}
// Não é possível criar uma instância de Shape:
// var shape = Shape(); // Erro
Exemplo de late:
// Declaração de variável com inicialização diferida
late String name;
void setupName() {
// Inicialização da variável antes do primeiro uso
name = "Flutter Developer";
}
void greet() {
// Primeiro uso da variável name após a inicialização
print("Hello, $name!");
}
void main() {
setupName();
greet(); // Mostrará "Hello, Flutter Developer!"
// Se `greet()` fosse chamado antes de `setupName()`, ocorreria um erro em tempo de execução
// greet(); // Erro se `name` não foi inicializado
}