Se non hai familiarità con OOP Matlab
Per coloro che non hanno familiarità con matlab, matlab fornisce una varietà di attributi di accesso durante la creazione delle variabili membro. Tutte le variabili membro sono essenzialmente proprietà C # a sé stante, chi ottiene e imposta i valori come predefiniti all'accesso normale e all'assegnazione. Qualsiasi variabile membro (e intendo qualsiasi) può avere il suo get e impostare "operatori" sovrascritti in questo modo:
%typical OOP class
classdef MyClass
%both Properties in the C# sense *and* member variables
%default access is public, put it here for clarity
properties (Access = public)
myProperty
myMember
end
methods
function self = set.myProperty(self, value)
% doesn't invoke recursion, actually references a variable called
% self.myProperty, which if you overwrite the get.property,
% you can't actually access outside of set and get
self.myProperty = ...
end
function value = get.myProperty(self)
...
end
%constructor, self is the class instance
function self = MyClass(value)
self.myMember = value;
%actually calls set.myProperty
self.myProperty = value;
end
end
end
Non puoi chiamare anche get.myProperty o set.myProperty, non è affatto nella lingua.
Se vuoi una proprietà C # reale, devi fare quanto segue, dato che a volte non puoi fare riferimento al valore reale usato all'interno delle funzioni myProperty
se hai definito un valore (come puoi solo riferire all'assegnazione di quel valore all'interno di quella funzione) o get (dove chiamerebbe sempre la funzione get).
classdef MyClass
%both Properties in the C# sense *and* member variables
%default access is public, put it here for clarity
properties (Access = private)
myMember
end
properties (Access = public, Dependent = true)
myProperty
end
methods
function self = set.myProperty(self, value)
% since the property is "dependent" it no longer can refer to a
% variable called self.myProperty, it can only refer to other properties
self.myMember = ...
end
function value = get.myProperty(self)
value = self.myMember
end
end
end
Sfondo attributo proprietà Matlab
Ora mi interessano in particolare le seguenti combinazioni di proprietà: Access
, GetAccess
, SetAccess
e Depedent
:
Accesso che definisce se la proprietà è pubblica, privata o protetta [1]
(Access = public|private|protected)
Ottieni / Imposta proprietà (funziona come l'accesso sopra, ma con funzioni get e set) [1]
(GetAccess = public|private|protected)
(SetAccess = public|private|protected)
Dipendente (in realtà non ha un valore direttamente associato ad esso, non può assegnare il suo nome all'interno del suo get e set, appare come una proprietà C # in seguito, ma può anche essere privato e protetto)
(Dependent = true|false)
Domanda
Una proprietà con get e set definiti che non era Dependent
è mai stata un caso d'uso valido? Sembra che tu stia nascondendo il valore stesso dalla classe in questo modo, stai rendendo il valore un dettaglio di implementazione alla tua classe. Per quanto riguarda le proprietà con get
o set
definite ma non entrambe?
La validità cambierebbe se Set/GetAccess
o generale Access
fosse cambiato in private
, protected
o public
?
Sulla stessa linea, le proprietà con% ridefinito% co_de e% co_de mai devono essere utilizzate nel codice di implementazione? Non hai idea di ciò che effettivamente fanno e ad un osservatore casuale sembrano semplicemente membri normali, quindi sembrerebbe che il loro uso sarebbe pericoloso nel codice di implementazione della classe, sembra che ciò richiederebbe anche una convenzione di denominazione separata.
[1] (Nota: può anche definire classi specifiche che hanno accesso alla proprietà che non sono correlate , la validità di questo è al di fuori dell'ambito della domanda).