Prima objected-oriented programming è stato introdotto in MATLAB (compreso sia classdef
-style e le classi di stile obsolete @-directory), uno could creare oggetti leggeri con chiusure e funzioni annidate (mancano eredità ovviamente). Questo concetto esiste anche in altre lingue.
Ecco un esempio:
function s = mystruct()
s = struct('value_1',[], 'value_2',2, 'sum',@mysum);
s.value_1 = 3;
function out = mysum()
out = s.value_1 + s.value_2;
end
end
che viene utilizzato come:
>> s = mystruct()
s =
value_1: 3
value_2: 2
sum: @mystruct/mysum
>> s.value_1 = 10; % NOTE: this wont do what you expect!
>> s.sum()
ans =
5
nota che le variabili sono immediatamente catturati durante la creazione di una chiusura (funzioni hanno la loro copia privata se si vuole). Quindi, se si modifica uno dei campi esposti dalla struttura restituita, non si rifletterà nello stato chiuso (pensateli come proprietà di sola lettura).
Una soluzione è quella di fornire metodi di accesso:
function obj = mystruct()
% think of those as private properties
value_1 = 3;
value_2 = 2;
% returned object (this or self)
obj = struct();
% public accessors for properties
obj.value_1 = @accessValue1;
function out = accessValue1(in)
if nargin > 0, value_1 = in; end
out = value_1;
end
obj.value_2 = @accessValue2;
function out = accessValue2(in)
if nargin > 0, value_2 = in; end
out = value_2;
end
% member method
obj.sum = @mysum;
function out = mysum()
out = value_1 + value_2;
end
end
Così ora potremmo dire:
>> s = mystruct()
s =
value_1: @mystruct/accessValue1
value_2: @mystruct/accessValue1
sum: @mystruct/mysum
>> x = s.value_1(); % get
>> s.value_1(10); % set
>> s.sum()
ans =
12
che sta cominciando a guardare come l'approccio consigliato corrente per creare classi:
classdef mystruct < handle
properties
value_1 = 3;
value_2 = 2;
end
methods
function out = sum(obj)
out = obj.value_1 + obj.value_2;
end
end
end
Utilizzato in modo simile:
>> s = mystruct()
s =
mystruct with properties:
value_1: 3
value_2: 2
>> s.value_1 = 10;
>> s.sum
ans =
12
Potremmo anche definire get/set access methods come prima ..
non si dovrebbe piuttosto utilizzare una classe di struct per questo? – Dan
Grazie per le risposte e i commenti rapidi. Ora, mi rendo conto che esiste un modo per definire una classe in MATLAB. – radarhead