Разница классов дескрипторов и значений - PullRequest
14 голосов
/ 22 июня 2011

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

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

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

Ответы [ 2 ]

21 голосов
/ 22 июня 2011

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

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

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

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

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

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

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

Ранее мы упоминали, что объекты в 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 голосов
/ 25 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...