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

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

26
задан Daniel 11 August 2015 в 17:35
поделиться

3 ответа

Используя Класс

Ванили При использовании класса ванили необходимо сказать 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

Используя Класс

Дескриптора, Если Вы наследовались классу дескриптора, который является

classdef testprop < handle

тогда, можно записать,

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

Обновление: Используя Класс

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

Спасибо Kamran.

26
ответ дан Community 28 November 2019 в 07:31
поделиться

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

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

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

8
ответ дан Marc 28 November 2019 в 07:31
поделиться

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

a=a.Request(1)

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

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

я думаю, что проблема состоит в том, что мы не определили вывода при объявлении Запрос метод. Таким образом, мы должны изменить его на:

function this = Request(this, val)

и теперь:

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

ans = 1
4
ответ дан GEOCHET 28 November 2019 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: