Подтвердить что ты не робот

Разница классов дескрипторов и значений

У меня есть некоторый фон на С++ и вы хотите использовать классы в Matlab.

В чем разница между дескриптором и классом значений?

Я знаю, что я бы использовал класс значений, если бы хотел определить матричный класс с перегруженными операторами, такими как "+" и "*". Однако иногда кажется, что все работает только для меня, как я хочу, когда я выбираю класс дескриптора.

4b9b3361

Ответ 1

В MathWorks содержится некоторая информация о том, для какой цели в их help, а также в PDF-документация. Я также нашел эту статью из проекта Yagtom ( первоначально Matt Dunham) станет отличным введением в ООП в MATLAB.

В этой помощи это объясняется следующим образом (внимание мое):

MATLAB поддерживает два типа классов - классы обработки и классы значений. Тип используемого вами класса зависит от желаемого поведения экземпляров класса и того, какие функции вы хотите использовать.

Используйте класс handle, если вы хотите создать ссылку на данные, содержащиеся в объекте класса, и не хотите, чтобы копии объекта копировали данные объекта. Например, используйте класс дескриптора для реализации объекта, который содержит информацию для записи телефонной книги. Несколько прикладных программ могут получить доступ к определенной записи телефонной книги, но может быть только один набор базовых данных.

Образное поведение дескрипторов позволяет этим классам поддерживать такие функции, как события, слушатели и динамические свойства.

Используйте классы значений для представления объектов, которые не обязательно должны быть уникальными, например числовые значения. Например, используйте класс значений для реализации типа полиномиальных данных. Вы можете скопировать

В статье Мэтта Данхэма сделан еще один хороший способ отличить оба типа классов:

Ранее мы упоминали, что объекты в Matlab (по умолчанию) передаются по значению, что означает, что полные копии передаются взад и вперед по вызовам метода. Однако графические объекты Matlab передаются по ссылке (через ручки). Если мы подклассифицируем встроенный класс handle [...], объекты нашего класса также будут переданы по ссылке, а не значения.

Я лично склонен использовать классы дескрипторов, чтобы получить некоторый синтаксис, с которым я привык с Java: для класса дескриптора вы можете хранить объект всю информацию, чтобы вы могли выполнять операции типа sort(a) (или a.sort()). Для классов значений эквивалент этого равен a = sort(a) (или a = a.sort()). Для операторов первый синтаксис не имеет никакого смысла, но второй, очевидно, обычно используется: например. a = a + b (это эквивалентно a = plus(a,b) и a = a.plus(b)).

  • Если основной задачей вашего класса является сохранение (числовых) значений какого-либо типа и возможность выполнения операций, наиболее вероятно, что класс значений.
  • Если вы хотите сохранить состояние, связанные с группой значения, соединить разные объекты вместе (связанные списки, графики,...), класс дескриптора может быть способом.

Или, по крайней мере, это то, что я обычно использую, чтобы сделать различие.

Ответ 2

Это на самом деле довольно просто и отличается от языков, которые вы отмечаете. Классы ручек передаются по ссылке. Классы значений проходят по значению. Отличие от c/С++ заключается в том, что механизм является частью системы типов, а не операцией, которая может выполняться для любой переменной.