Riepilogo - Calcolatore di forme
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 49 di 110.
Sfida
FacileCostruiamo un sistema per calcolare le proprietà delle forme geometriche, che unisce classi astratte e interfacce per creare un toolkit geometrico flessibile. Progetterai una gerarchia di classi in cui le diverse forme condividono comportamenti comuni tramite l'astrazione, mentre ciascuna forma fornisce i propri calcoli specifici.
Organizzerai il codice in tre file:
shape.dart: definisci qui la classe base astratta e l'interfaccia:- Una classe astratta
Shapecon una proprietàString namee un costruttore. Includi i metodi astrattidouble calculateArea()edouble calculatePerimeter(). Aggiungi un metodo normaledescribe()che stampa[name] - Area: [calculateArea()], Perimeter: [calculatePerimeter()] - Una classe
Drawablecon un metododraw()che stampaDrawing shape...
- Una classe astratta
shapes.dart: importashape.darte crea le classi concrete delle forme:- Una classe
Rectangleche estendeShapee implementaDrawable. Aggiungi le proprietàdouble widthedouble height. Calcola l'area comewidth * heighte il perimetro come2 * (width + height). Il metododraw()dovrebbe stampareDrawing rectangle [width]x[height] - Una classe
Circleche estendeShapee implementaDrawable. Aggiungi una proprietàdouble radius. Usa3.14159per pi. Calcola l'area comepi * radius * radiuse il perimetro (circonferenza) come2 * pi * radius. Il metododraw()dovrebbe stampareDrawing circle with radius [radius]
- Una classe
main.dart: importashapes.darte mostra il funzionamento del tuo calcolatore di forme:- Crea un
Rectanglechiamato'Rectangle'con larghezza5.0e altezza3.0 - Crea un
Circlechiamato'Circle'con raggio4.0 - Per ogni forma, chiama
draw()e poidescribe() - Stampa una riga vuota tra le due forme
- Crea un
Questa sfida mostra come le classi astratte definiscono una struttura condivisa (ogni forma prevede calcoli dell'area e del perimetro), mentre le interfacce aggiungono ulteriori capacità (le forme che si possono disegnare). Ogni classe concreta estende la classe astratta per la propria identità fondamentale e implementa l'interfaccia per le funzionalità aggiuntive.
Output previsto:
Drawing rectangle 5.0x3.0
Rectangle - Area: 15.0, Perimeter: 16.0
Drawing circle with radius 4.0
Circle - Area: 50.26544, Perimeter: 25.13272Provalo tu
import 'shapes.dart';
void main() {
// TODO: Crea un Rectangle chiamato 'Rectangle' con larghezza 5.0 e altezza 3.0
// TODO: Crea un Circle chiamato 'Circle' con raggio 4.0
// TODO: Per il rettangolo, chiama draw() e poi describe()
// TODO: Stampa una riga vuota
// TODO: Per il cerchio, chiama draw() e poi describe()
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online