Menu
Coddy logo textTech

Metodi astratti

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 44 di 110.

Un metodo astratto è un metodo dichiarato all'interno di una classe astratta che non ha un corpo. Definisce la firma del metodo, ma lascia l'implementazione a ciascuna sottoclasse. Qualsiasi classe che estende la classe astratta deve sovrascrivere tutti i metodi astratti, altrimenti sarà anch'essa astratta.

abstract class Animal {
  // Metodo astratto - senza corpo, deve essere implementato dalle sottoclassi
  String makeSound();

  // Metodo concreto - ha un corpo, condiviso da tutte le sottoclassi
  void breathe() {
    print('Breathing...');
  }
}

class Dog extends Animal {
  @override
  String makeSound() {
    return 'Woof!';  // Deve fornire un'implementazione
  }
}

class Cat extends Animal {
  @override
  String makeSound() {
    return 'Meow!';  // Implementazione diversa, stessa firma
  }
}

Se una sottoclasse dimentica di implementare un metodo astratto, Dart ti segnalerà un errore di compilazione. Questo è proprio il punto: i metodi astratti impongono un contratto. È garantito che ogni sottoclasse abbia quel metodo, quindi puoi chiamarlo in sicurezza su qualsiasi istanza del tipo astratto.

// Puoi usare il tipo astratto come tipo di una variabile
Animal a = Dog();
print(a.makeSound());  // Bau!

Animal b = Cat();
print(b.makeSound());  // Miao!

I metodi astratti sono diversi dai metodi concreti in una classe astratta. I metodi concreti hanno un corpo e vengono ereditati così come sono. I metodi astratti non hanno un corpo e devono essere sovrascritti.

Puoi combinarli entrambi nella stessa classe astratta per condividere alcuni comportamenti, obbligando al contempo le sottoclassi a definirne di propri per gli altri.

CaratteristicaMetodo astrattoMetodo concreto
Ha un corpoNoSì
Deve essere sovrascrittoSìNo
ScopoImporre un contrattoCondividere il comportamento
DoveSolo nelle classi astratteQualsiasi classe
challenge icon

Sfida

Facile

Costruiamo un calcolatore di forme che mostri in azione i metodi astratti. Definirai una classe astratta con metodi astratti che ogni forma dovrà implementare in modo diverso, poi userai queste forme tramite un'interfaccia comune.

Organizzerai il codice in quattro file:

  • shape.dart: Definisci una classe astratta Shape con un campo final color (String) e un costruttore che lo inizializza. Dichiara due metodi astratti: double area() e double perimeter(). Aggiungi anche un metodo concreto describe() che stampa A [color] shape with area: [area] and perimeter: [perimeter]. Poiché area() e perimeter() sono astratti, ogni sottoclasse fornirà il proprio calcolo, ma describe() funziona per tutte senza essere sovrascritto.
  • circle.dart: Crea una classe Circle che estende Shape. Ha un campo final radius (double). Il suo costruttore accetta color e radius e passa color a super. Implementa area() in modo che restituisca 3.14 * radius * radius e perimeter() in modo che restituisca 2 * 3.14 * radius.
  • rectangle.dart: Crea una classe Rectangle che estende Shape. Ha i campi final width e height (entrambi double). Il suo costruttore accetta color, width e height e passa color a super. Implementa area() in modo che restituisca width * height e perimeter() in modo che restituisca 2 * (width + height).
  • main.dart: Importa tutti i file. Crea un Circle con colore 'red' e raggio 5.0, e un Rectangle con colore 'blue', larghezza 4.0 e altezza 6.0. Chiama describe() su ciascuna forma. Poi crea una List<Shape> contenente entrambe le forme, scorri la lista e stampa Area: [area] per ciascuna forma.

Output previsto:

A red shape with area: 78.5 and perimeter: 31.400000000000002
A blue shape with area: 24.0 and perimeter: 20.0
Area: 78.5
Area: 24.0

Provalo tu

import 'shape.dart';
import 'circle.dart';
import 'rectangle.dart';

void main() {
  // TODO: Crea un Circle con colore 'red' e raggio 5.0

  // TODO: Crea un Rectangle con colore 'blue', larghezza 4.0 e altezza 6.0

  // TODO: Chiama describe() sul cerchio

  // TODO: Chiama describe() sul rettangolo

  // TODO: Crea una List<Shape> che contenga entrambe le forme

  // TODO: Scorri la lista e stampa "Area: [area]" per ogni forma
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Dart online