Skip to content

Instantly share code, notes, and snippets.

@nicol-ograve
Last active March 2, 2025 11:16
Show Gist options
  • Save nicol-ograve/fd5f8cc45d295dd1d3da3bf75c28a901 to your computer and use it in GitHub Desktop.
Save nicol-ograve/fd5f8cc45d295dd1d3da3bf75c28a901 to your computer and use it in GitHub Desktop.
import 'dart:math';
// Classe astratta che definisce una figura geometrica
abstract class Figura {
double get area; // Getter astratto per l'area
double get perimetro; // Getter astratto per il perimetro
void descrizione() {
print("Sono una figura geometrica.");
}
}
// Mixin per oggetti che possono essere colorati
mixin Colorabile {
String _colore = "Bianco";
String get colore => _colore;
set colore(String nuovoColore) {
_colore = nuovoColore;
print("Colore cambiato in $_colore.");
}
}
// Interfaccia per oggetti che possono essere scalati
abstract class Scalabile {
void scala(double fattore);
}
// Classe concreta: Cerchio
class Cerchio extends Figura implements Scalabile {
double raggio;
Cerchio(this.raggio);
@override
double get area => pi * raggio * raggio;
@override
double get perimetro => 2 * pi * raggio;
@override
void scala(double fattore) {
raggio *= fattore;
print("Il nuovo raggio è $raggio");
}
@override
void descrizione() {
print("Sono un cerchio con raggio $raggio.");
}
}
// Classe concreta: Rettangolo
class Rettangolo extends Figura with Colorabile implements Scalabile {
double base, altezza;
Rettangolo(this.base, this.altezza);
@override
double get area => base * altezza;
@override
double get perimetro => 2 * (base + altezza);
@override
void scala(double fattore) {
base *= fattore;
altezza *= fattore;
print("Le nuove dimensioni sono base: $base, altezza: $altezza.");
}
@override
void descrizione() {
print("Sono un rettangolo di base $base e altezza $altezza, colore $colore.");
}
}
void main() {
// Creazione di un cerchio
Cerchio c = Cerchio(5);
c.descrizione();
print("Area: ${c.area}");
print("Perimetro: ${c.perimetro}");
c.scala(1.5);
print("\n");
// Creazione di un rettangolo
Rettangolo r = Rettangolo(4, 6);
r.descrizione();
print("Area: ${r.area}");
print("Perimetro: ${r.perimetro}");
r.scala(2);
r.colore = "Blu"; // Usa il setter per cambiare colore
r.descrizione();
}
// Esempio di utilizzo del copyWith
class Persona {
final String nome;
final int eta;
// Costruttore
Persona({required this.nome, required this.eta});
// Metodo copyWith per creare una nuova istanza con modifiche opzionali
Persona copyWith({String? nome, int? eta}) {
return Persona(
nome: nome ?? this.nome, // Mantiene il valore attuale se non viene specificato un nuovo valore
eta: eta ?? this.eta,
);
}
@override
String toString() {
return "Persona(nome: $nome, età: $eta)";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment