name - ¿Cómo funcionan las propiedades en Object Oriented MATLAB?
matlab plot series name (3)
Usando una clase de vainilla
Al usar la clase estándar, debe decirle a Matlab que almacene una copia modificada del objeto para guardar los cambios en el valor de la propiedad. Asi que,
>> a=testprop
>> a.Request(5); % will NOT change the value of a.numRequests.
5
>> a.Request(5)
5
>> a.numRequests
ans =
0
>> a=a.Request; % However, this will work but as you it makes a copy of variable, a.
5
>> a=a.Request;
5
>> a.numRequests
ans =
2
Uso de la clase Handle
Si heredas de la clase de control, eso es
classdef testprop < handle
entonces puedes escribir,
>> a.Request(5);
>> a.Request(5);
>> a.numRequests
ans =
2
Actualización: Uso de Vanilla Class
Como Kamran observa para que lo anterior funcione, la definición del método de Request
en el código de ejemplo de la pregunta necesita ser cambiada para incluir un argumento de salida de tipo testprop .
Gracias Kamran.
Estoy intentando crear una clase MATLAB con una variable miembro que se está actualizando como resultado de una invocación a un método, pero cuando trato de cambiar la propiedad dentro de la clase (aparentemente, por lo que entendí de la gestión de memoria de MATLAB) crea una copia del objeto y luego lo modifica, dejando intacta la propiedad del objeto original.
classdef testprop
properties
numRequests=0;
end
methods
function Request(this, val)
disp(val);
this.numRequests=this.numRequests+1;
end
end
end
.
>> a=testprop;
>> a.Request(9);
>> a.Request(5);
>> a.numRequests
ans = 0
Debes recordarlo sintácticamente en Matlab, probablemente estés más cerca de C, que C ++ o Java, al menos con respecto a los objetos. Por lo tanto, si desea cambiar los "contenidos" de un objeto de valor (realmente solo una struct
especial), debe devolver el objeto de la función.
Azim estuvo en lo correcto al señalar que si desea el comportamiento de Singleton (que, según su código, parece), necesita usar una clase "manejar". Las instancias de clases que se derivan de Handle all apuntan a una sola instancia y operan solo sobre ella.
Puede leer más sobre las diferencias entre las clases Value y Handle.
Hice la clase testprop e intenté ejecutar el código sugerido por Azim, pero no funcionó. Cuando ejecuté el siguiente comando:
a=a.Request(1)
Se generó el siguiente error:
??? Error al usar ==> Solicitar demasiados argumentos de salida.
Creo que el problema es que no determinamos ningún resultado al declarar el método de Solicitud . Entonces deberíamos cambiarlo a:
function this = Request(this, val)
y ahora:
>> a = testprop;
>> a = a.Request(1);
>> a.numRequests
ans = 1