Как работают свойства в объектно-ориентированном MATLAB?

matlab oop properties matlab-class

15262 просмотра

3 ответа

0 Репутация автора

Я пытаюсь создать класс MATLAB с переменной-членом, которая обновляется в результате вызова метода, но когда я пытаюсь изменить свойство в классе, оно (по-видимому, из того, что я понял из управления памятью MATLAB) создает копию объекта, а затем изменяет его, оставляя свойство исходного объекта без изменений.

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  
Автор: Dani Источник Размещён: 16.10.2008 03:22

Ответы (3)


25 плюса

6510 Репутация автора

Использование ванильного класса

При использовании класса vanilla вы должны указать Matlab сохранить измененную копию объекта, чтобы сохранить изменения в значении свойства. Так,

>> 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

Использование класса Handle

Если вы наследуете от класса дескриптора, то это

classdef testprop < handle

тогда вы можете написать,

>> a.Request(5);
>> a.Request(5);
>> a.numRequests
ans = 
       2

Обновление: использование класса Vanilla

Как отмечает Кямран, чтобы вышесказанное работало, определение Requestметода в коде примера вопроса необходимо изменить, чтобы включить выходной аргумент типа testprop .

Спасибо, Камран.

Автор: Azim Размещён: 16.10.2008 03:53

8 плюса

2485 Репутация автора

Вы должны помнить, что синтаксически в Matlab вы, вероятно, ближе к C, чем к C ++ или Java, по крайней мере, в отношении объектов. Итак, если вы хотите изменить «содержимое» объекта-значения (на самом деле просто специальное struct), вам необходимо вернуть объект из функции.

Azim был прав, когда указал, что если вы хотите поведение Singleton (которое, как вам кажется, из вашего кода), вам нужно использовать класс «handle». Экземпляры классов, производные от Handle, все указывают на один экземпляр и работают только с ним.

Вы можете прочитать больше о различиях между классами Value и Handle.

Автор: Marc Размещён: 10.11.2008 04:15

4 плюса

3310 Репутация автора

Я сделал класс testprop и попытался извинить код, предложенный Azim, но он не сработал. Когда я выполнил следующую команду:

a=a.Request(1)

Следующая ошибка была сгенерирована:

??? Ошибка при использовании ==> запроса. Слишком много выходных аргументов.

Я думаю, что проблема в том, что мы не определили никакого вывода при объявлении метода Request . Поэтому мы должны изменить это на:

function this = Request(this, val)

и сейчас:

>> a = testprop;
>> a = a.Request(1);        
>> a.numRequests

ans = 1
Автор: Kamran Bigdely Размещён: 23.03.2009 12:26
Вопросы из категории :
32x32