Corso di Raku / Oggetti, input/output ed eccezioni / Classi e oggetti

Ruoli

Un ruolo è un fascio di comportamenti (e a volte di dati) che può essere condiviso da più classi. Mentre l’ereditarietà dice che una classe è un tipo di un’altra, un ruolo descrive qualcosa che una classe sa fare.

Un ruolo si definisce con la parola chiave role, quasi come una classe, e lo si dà a una classe con il tratto does:

role Greet {
    method hello {
        'Hello from ' ~ self.name;
    }
}

class Person does Greet {
    has $.name;
}

Ora la classe Person ha il metodo hello del ruolo, come se fosse scritto nella classe stessa:

say Person.new(name => 'Anna').hello; # Hello from Anna

Una classe che assume un ruolo viene riconosciuta come portatrice di quel ruolo:

say Person.new(name => 'Anna') ~~ Greet; # True

Nota che il metodo hello del ruolo usa self.name, anche se il ruolo stesso non ha alcun attributo name. Va benissimo: il metodo gira come parte della classe che compone il ruolo, e quella classe fornisce name. L’argomento successivo mostra che una classe può assumere più di un ruolo per volta.

Argomenti di questa sezione

Pratica

Risolvi 1 quiz sul contenuto di questa sezione.

Esercizi

Questa sezione contiene 3 esercizi. Guarda tutti gli argomenti di questa sezione prima di iniziare gli esercizi.

  1. Una scatola con una misura
  2. Un animale con nome ed età
  3. Un robot che balla

Soluzione: Un attributo ereditato   |   Comporre più ruoli