Contenuto principale

Creazione di una classe semplice

Progettazione della classe

Lo scopo principale di una classe è definire un oggetto che racchiuda i dati e le operazioni eseguite su di essi. Ad esempio, BasicClass definisce una proprietà e due metodi che operano sui dati contenuti in tale proprietà:

  • Value: proprietà che contiene i dati numerici memorizzati in un oggetto della classe

  • roundOff: metodo che arrotonda il valore della proprietà a due cifre decimali

  • multiplyBy: metodo che moltiplica il valore della proprietà per il numero specificato

Iniziare la definizione di una classe con un blocco classdef ClassName...end, quindi definire le proprietà e i metodi della classe all'interno di tale blocco. Questa è la definizione di BasicClass:

classdef BasicClass
   properties
      Value {mustBeNumeric}
   end
   methods
      function r = roundOff(obj)
         r = round([obj.Value],2);
      end
      function r = multiplyBy(obj,n)
         r = [obj.Value]*n;
      end
   end
end

Per un riepilogo della sintassi delle classi, vedere classdef.

Per utilizzare la classe:

  • Salvare la definizione della classe in un file .m con lo stesso nome della classe.

  • Creare un oggetto della classe.

  • Accedere alle proprietà per assegnare i dati.

  • Chiamare i metodi per eseguire le operazioni sui dati.

Creazione di un oggetto

Creare un oggetto della classe utilizzando il nome della classe:

a = BasicClass
a = 

  BasicClass with properties:

    Value: []

Inizialmente, il valore della proprietà è vuoto.

Accesso alle proprietà

Assegnare un valore alla proprietà Value utilizzando la variabile oggetto e un punto prima del nome della proprietà:

a.Value = pi/3;

Per restituire il valore di una proprietà, utilizzare la notazione a punto senza l'assegnazione:

a.Value
ans =

    1.0472

Per informazioni sulle proprietà della classe, vedere Property Syntax.

Chiamata dei metodi

Chiamare il metodo roundOff sull'oggetto a:

roundOff(a)
ans =

    1.0500

Passare l'oggetto come primo argomento a un metodo che accetta più argomenti, come in questa chiamata al metodo multiplyBy:

multiplyBy(a,3)
ans =

    3.1416

È inoltre possibile chiamare un metodo utilizzando la notazione a punto:

a.multiplyBy(3)

Quando si utilizza la notazione a punto, non è necessario passare l'oggetto come argomento esplicito. La notazione utilizza l'oggetto a sinistra del punto.

Per informazioni sui metodi della classe, vedere Method Syntax.

Aggiunta di un costruttore

Le classi possono definire un metodo speciale per creare oggetti della classe, chiamato costruttore. I metodi costruttori consentono di passare argomenti al costruttore, che possono essere assegnati come valori delle proprietà. La proprietà BasicClass Value limita i suoi valori possibili utilizzando la funzione mustBeNumeric.

Questo è un costruttore per la classe BasicClass. Quando si chiama il costruttore con un argomento di input, questo viene assegnato alla proprietà Value. Se si chiama il costruttore senza un argomento di input, la proprietà Value ha un valore predefinito vuoto ([]).

methods        
    function obj = BasicClass(val)
        if nargin == 1
            obj.Value = val;
        end
    end
end

Aggiungendo questo costruttore alla definizione della classe, è possibile creare un oggetto e impostare il valore della proprietà in un unico passaggio:

a = BasicClass(pi/3)
a = 

  BasicClass with properties:

    Value: 1.0472

Il costruttore può eseguire altre operazioni relative alla creazione di oggetti della classe.

Per informazioni sui costruttori, vedere Class Constructor Methods.

Vettorializzazione dei metodi

MATLAB® consente di vettorializzare le operazioni. Ad esempio, è possibile aggiungere un numero a un vettore:

[1 2 3] + 2
ans =

     3     4     5

MATLAB aggiunge il numero 2 a ciascuno degli elementi dell'array [1 2 3]. Per vettorializzare i metodi dell'operatore aritmetico, racchiudere il riferimento alla proprietà obj.Value tra parentesi.

[obj.Value] + 2

Questa sintassi consente al metodo di funzionare con array di oggetti. Ad esempio, creare un array di oggetti utilizzando l'assegnazione indicizzata.

obj(1) = BasicClass(2.7984);
obj(2) = BasicClass(sin(pi/3));
obj(3) = BasicClass(7);

Queste due espressioni sono equivalenti.

[obj.Value] + 2
[obj(1).Value obj(2).Value obj(3).Value] + 2

Il metodo roundOff è vettorializzato perché il riferimento alla proprietà è racchiuso tra parentesi.

r = round([obj.Value],2);
Poiché roundOff è vettorializzato, può operare sugli array.

roundOff(obj)
ans =

    2.8000    0.8700    7.0000

Sovraccarico delle funzioni

Le classi possono implementare funzionalità esistenti, come l'addizione, definendo un metodo con lo stesso nome della funzione di MATLAB esistente. Ad esempio, si supponga che si desideri aggiungere due oggetti BasicClass. Appare logico sommare i valori delle proprietà Value di ciascun oggetto.

Questa è una versione sovraccaricata della funzione di MATLAB plus. Definisce l'addizione per la classe BasicClass come l'aggiunta dei valori delle proprietà:

methods
   function r = plus(o1,o2)
      r = [o1.Value] + [o2.Value];
   end
end

Implementando un metodo chiamato plus, è possibile utilizzare l'operatore "+" con gli oggetti di BasicClass.

a = BasicClass(pi/3);
b = BasicClass(pi/4);
a + b
ans =

    1.8326

Vettorializzando il metodo plus, è possibile operare sugli array di oggetti.

a = BasicClass(pi/3);
b = BasicClass(pi/4);
c = BasicClass(pi/2);
ar = [a b];
ar + c
ans =

    2.6180    2.3562

Informazioni correlate

Per informazioni sul sovraccarico delle funzioni, vedere Overload Functions in Class Definitions.

Per informazioni sul sovraccarico degli operatori, vedere Operator Overloading.

Elenco dei codici BasicClass

Questa è la definizione BasicClass dopo l'aggiunta delle feature discusse in questo argomento:

classdef BasicClass
    properties
        Value {mustBeNumeric}
    end
    methods
        function obj = BasicClass(val)
            if nargin == 1
                obj.Value = val;
            end
        end
        function r = roundOff(obj)
            r = round([obj.Value],2);
        end
        function r = multiplyBy(obj,n)
            r = [obj.Value] * n;
        end
        function r = plus(o1,o2)
            r = [o1.Value] + [o2.Value];
        end
    end
end

Vedi anche

Argomenti