🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Oggetti in Dart: Guida Completa alla Programmazione Orientata agli Oggetti

Codegrind Team•Sep 25 2024

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 e age) 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 classe Person, 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.