Differenza di classi di handle e valori

Ho qualche background in C ++ e voglio usare le classi in Matlab.

Qual è la differenza tra un handle e una class di valore?

So che userei una class di valore se volessi definire una class matrice con operatori sovraccaricati come “+” e “*”. Tuttavia, a volte sembra che le cose funzionino solo per me come voglio quando scelgo una class handle.

The MathWorks fornisce alcune informazioni su cui essere utilizzati per quale scopo nel loro aiuto e anche nella loro documentazione PDF . Ho anche trovato questo articolo del Progetto Yagtom (originariamente di Matt Dunham ) come una grande introduzione a OOP in MATLAB.

Nell’aiuto questo è spiegato come segue (sottolineatura mia):

MATLAB supporta due tipi di classi: gestisce classi e classi di valore. Il tipo di class che utilizzi dipende dal comportamento desiderato delle istanze di class e dalle funzionalità che desideri utilizzare.

Utilizzare una class handle quando si desidera creare un riferimento ai dati contenuti in un object della class e non si desidera che le copie dell’object eseguano copie dei dati dell’object. Ad esempio, utilizzare una class handle per implementare un object che contiene informazioni per una voce della rubrica. Più programmi applicativi possono accedere a una particolare voce della rubrica, ma può esserci solo un gruppo di dati sottostanti.

Il comportamento di riferimento degli handle consente a queste classi di supportare funzionalità come eventi, listener e proprietà dinamiche.

Utilizza le classi di valore per rappresentare quadro che non devono necessariamente essere univoche, come valori numerici. Ad esempio, utilizzare una class di valore per implementare un tipo di dati polinomiale. Puoi copiare

Nell’articolo di Matt Dunham, viene fatto un altro buon punto per distinguere entrambi i tipi di classi:

Abbiamo precedentemente menzionato che gli oggetti in Matlab sono, (di default) passati per valore , il che significa che le copie complete vengono passate avanti e indietro nelle chiamate di metodo. Gli oggetti grafici Matlab, tuttavia, vengono passati per riferimento (tramite gli handle). Se eseguiamo la sottoclass della class handle incorporata […], allora gli oggetti della nostra class verranno passati anche per riferimento, non per valore.

Personalmente tendo ad usare le classi handle per ottenere una parte della syntax a cui sono abituato con Java: per una class handle, è ansible avere l’archivio oggetti tutte le informazioni, in modo da poter avere operazioni come sort(a) (o a.sort() ) essere eseguito sul posto. Per le classi di valore l’equivalente di questo è a = sort(a) (o a = a.sort() ). Per gli operatori la prima syntax non ha alcun senso, ma la seconda è ovviamente di uso generale: ad esempio a = a + b (questo è equivalente a a = plus(a,b) e a = a.plus(b) ).

  • Se la preoccupazione principale della tua class è di memorizzare valori (numerici) di qualche tipo e di essere in grado di eseguire operazioni, la class di valore è molto probabilmente la strada da percorrere.
  • Se vuoi memorizzare uno stato, raggruppare i valori relativi, connettere diversi oggetti insieme (liste collegate, grafici, …), la class handle potrebbe essere la strada da percorrere.

O almeno, è quello che tendo a usare per fare la distinzione.

In realtà è abbastanza semplice e diverso dalle lingue che noti. Le classi di handle vengono passate per riferimento. Le classi di valore passano per valore. La differenza da c / c ++ è che il meccanismo fa parte del sistema di tipi, non un’operazione che può essere eseguita su qualsiasi variabile.