2011-06-22 2 views
13

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

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

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

ответ

19

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

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

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

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

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

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

В статье Matt Dunham, еще одна хорошая точка сделана различать оба типа классов:

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

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

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

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

0

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

Смежные вопросы