Oggetti in Dart: Guida Completa alla Programmazione Orientata agli Oggetti
La programmazione orientata agli oggetti (OOP) è un paradigma fondamentale in Dart, che consente di modellare il mondo reale attraverso oggetti e classi. In questo articolo, esploreremo i concetti chiave degli oggetti in Dart, come crearli, utilizzarli e gestirli, per costruire applicazioni modulari e ben strutturate.
Cos’è un Oggetto in Dart?
In Dart, un oggetto è un’istanza di una classe. Le classi sono i modelli da cui vengono creati gli oggetti, e definiscono le proprietà (attributi) e i metodi (comportamenti) che gli oggetti possono avere. Gli oggetti rappresentano entità con stato e comportamento, e possono interagire tra loro attraverso i metodi e le proprietà definiti nella loro classe.
Esempio di Creazione e Utilizzo di un Oggetto
Consideriamo una semplice classe Person
che rappresenta una persona con un nome e un’età , e un metodo per presentarsi:
// lib/person.dart
class Person {
String name;
int age;
Person(this.name, this.age);
void introduce() {
print('Hi, my name is $name and I am $age years old.');
}
}
In questo esempio:
- Classe
Person
: Definisce due proprietĂ (name
eage
) e un metodo (introduce
). - Costruttore: Il costruttore
Person(this.name, this.age)
inizializza le proprietà dell’oggetto.
Per creare e utilizzare un oggetto della classe Person
, puoi fare quanto segue:
// lib/main.dart
import 'person.dart';
void main() {
// Creazione di un oggetto Person
var person = Person('Alice', 30);
// Utilizzo del metodo dell'oggetto
person.introduce(); // Output: Hi, my name is Alice and I am 30 years old.
}
In questo codice:
- Creiamo un oggetto
person
della classePerson
, inizializzandolo con il nome “Alice” e l’età 30. - Chiamiamo il metodo
introduce
per stampare una presentazione.
ProprietĂ e Metodi degli Oggetti
Gli oggetti in Dart possono avere diverse proprietà e metodi che definiscono il loro comportamento e stato. Le proprietà sono variabili associate alla classe, mentre i metodi sono funzioni definite all’interno della classe.
ProprietĂ degli Oggetti
Le proprietà possono essere di qualsiasi tipo di dato e possono essere modificate o lette. Le proprietà possono essere pubbliche (accessibili ovunque) o private (accessibili solo all’interno della classe).
class Car {
String model;
int year;
Car(this.model, this.year);
void displayInfo() {
print('Model: $model, Year: $year');
}
}
In questo esempio, model
e year
sono proprietà dell’oggetto Car
.
Metodi degli Oggetti
I metodi definiscono le azioni che un oggetto può eseguire. Possono accedere e modificare le proprietà dell’oggetto.
class Rectangle {
double width;
double height;
Rectangle(this.width, this.height);
double calculateArea() {
return width * height;
}
void displayArea() {
print('Area: ${calculateArea()}');
}
}
Nel caso di Rectangle
, calculateArea
calcola l’area del rettangolo e displayArea
la mostra.
Costruttori e Inizializzazione degli Oggetti
I costruttori sono speciali metodi utilizzati per creare e inizializzare gli oggetti. Dart supporta costruttori normali, costruttori nominati e costruttori di copia.
Costruttore Normale
Il costruttore normale è quello mostrato negli esempi precedenti:
class Book {
String title;
String author;
Book(this.title, this.author);
}
Costruttori Nominati
I costruttori nominati consentono di creare istanze di una classe utilizzando nomi diversi per il costruttore. Questo è utile per avere più opzioni di inizializzazione.
class Point {
final int x;
final int y;
Point(this.x, this.y);
Point.origin() : x = 0, y = 0; // Costruttore nominato
}
In questo esempio, Point.origin()
è un costruttore nominato che crea un punto all’origine (0, 0).
Costruttori di Copia
I costruttori di copia permettono di creare una nuova istanza di una classe copiando i valori da un’altra istanza.
class Person {
String name;
int age;
Person(this.name, this.age);
Person.copy(Person other)
: name = other.name,
age = other.age;
}
In questo esempio, il costruttore Person.copy
crea una copia di un oggetto Person
esistente.
Incapsulamento e VisibilitĂ degli Oggetti
L’incapsulamento è un principio fondamentale della programmazione orientata agli oggetti che aiuta a proteggere lo stato interno di un oggetto. In Dart, puoi controllare la visibilità delle proprietà e dei metodi usando modificatori di accesso.
ProprietĂ Private
Per rendere una proprietĂ privata, devi precederla con un underscore (_
). Le proprietà private sono accessibili solo all’interno della stessa classe.
class Account {
String _accountNumber;
double _balance;
Account(this._accountNumber, this._balance);
void deposit(double amount) {
_balance += amount;
}
void withdraw(double amount) {
if (amount <= _balance) {
_balance -= amount;
} else {
print('Insufficient funds');
}
}
double get balance => _balance;
}
Metodi Privati
I metodi privati sono definiti nello stesso modo delle proprietà private e sono accessibili solo all’interno della classe che li definisce.
class Counter {
int _count = 0;
void increment() {
_incrementInternal();
}
void _incrementInternal() {
_count++;
}
int get count => _count;
}
Conclusione
Gli oggetti sono una componente centrale della programmazione orientata agli oggetti in Dart. Comprendere come crearli, utilizzarli e gestirli è essenziale per costruire applicazioni modulari e riutilizzabili. Utilizzando costruttori, proprietà e metodi in modo efficace, e applicando i principi di incapsulamento, puoi progettare codice ben strutturato e manutenibile.