Язык программирования MATLAB ® отличается от других объектно-ориентированных языков, таких как C++ или Java ® некоторыми важными способами.
В отличие от полей на языке C++ или Java, свойства MATLAB можно использовать для определения открытого интерфейса отдельно от реализации хранения данных. Можно предоставить общий доступ к свойствам, поскольку можно определить методы set и access, которые выполняются автоматически при назначении или запросе значений свойств. Например, следующий оператор:
myobj.Material = 'plastic';назначает char вектор plastic в Material имущество myobj. Перед выполнением фактического присвоения, myobj выполняет метод с именем set.Material (предполагая класс myobj определяет этот метод), который может выполнять любые необходимые операции. Дополнительные сведения о методах доступа к свойствам см. в разделе Методы доступа к свойствам.
Можно также управлять доступом к свойствам, задав атрибуты, которые разрешают открытый, защищенный или частный доступ. Полный список атрибутов свойств см. в разделе Атрибуты свойств.
В некоторых языках один параметр объекта для метода всегда является неявным. В MATLAB объекты являются явными параметрами методов, которые действуют на них.
В классах MATLAB диспетчеризация методов не основана на сигнатуре метода, как в коде C++ и Java. Когда список аргументов содержит объекты с одинаковым приоритетом, MATLAB использует самый левый объект для выбора метода для вызова.
Однако если класс аргумента превосходит класс других аргументов, MATLAB отправляет метод вышестоящего аргумента независимо от его положения в списке аргументов.
Дополнительные сведения см. в разделе Приоритет класса.
В C++ метод суперкласса вызывается с помощью оператора области действия: superclass::method
В коде Java используются: superclass.method
Эквивалентная операция MATLAB: .method@superclass
В классах MATLAB нет эквивалента шаблонам C++ или дженерикам Java. Однако MATLAB имеет слабую типизацию и имеется возможность записи функций и классов, работающих с различными типами данных.
Классы MATLAB не поддерживают перегрузку функций с использованием различных сигнатур для одного и того же имени функции.
Классы MATLAB могут определять общие свойства, которые можно изменить, явно назначив значения этим свойствам в данном экземпляре класса. Однако только классы, полученные из handle класс демонстрирует ссылочное поведение. Изменение значения свойства в экземпляре классов значений (классы, не производные от handle), изменяет значение только в контексте, в котором выполняется изменение.
В следующих разделах это поведение описано более подробно.
MATLAB передает все переменные по значению. При передаче объекта функции MATLAB копирует значение из вызывающей функции в переменную параметра вызываемой функции.
Однако MATLAB поддерживает два вида классов, которые ведут себя по-разному при копировании:
Классы дескрипторов - переменная экземпляра класса дескрипторов ссылается на объект. Копия переменной экземпляра класса дескриптора ссылается на тот же объект, что и исходная переменная. Если функция изменяет объект-дескриптор, переданный в качестве входного аргумента, изменение влияет на объект, на который ссылается исходный и скопированный дескрипторы.
Классы значений - данные свойств в экземпляре класса значений не зависят от данных свойств в копиях этого экземпляра (хотя свойство класса значений может содержать дескриптор). Функция может изменять объект значения, передаваемый в качестве входного аргумента, но это изменение не влияет на исходный объект.
Дополнительные сведения о поведении и использовании обоих типов классов см. в разделе Сравнение классов дескрипторов и значений.
Передача объектов значений. При передаче объекта значения функции функция создает локальную копию переменной аргумента. Функция может изменять только копию. Если требуется изменить исходный объект, верните измененный объект и присвойте ему имя исходной переменной. Например, рассмотрим класс значений, SimpleClass :
classdef SimpleClass properties Color end methods function obj = SimpleClass(c) if nargin > 0 obj.Color = c; end end end end
Создание экземпляра SimpleClass, присваивая значение red к Color свойство:
obj = SimpleClass('red');
Передача объекта функции g, которая присваивает blue в Color свойство:
function y = g(x) x.Color = 'blue'; y = x; end
y = g(obj);
Функция g изменяет свою копию входного объекта и возвращает эту копию, но не изменяет исходный объект.
y.Color
ans =
blueobj.Color
ans =
redЕсли функция g не вернул значение, изменение объекта Color свойство возникло бы только на копии obj в рабочей области функции. Эта копия вышла бы из области действия после завершения выполнения функции.
Перезапись исходной переменной фактически заменяет ее новым объектом:
obj = g(obj);
Передача объектов-дескрипторов. При передаче дескриптора функции функция создает копию переменной дескриптора, как и при передаче объекта значения. Однако, поскольку копия объекта-дескриптора ссылается на тот же объект, что и исходный дескриптор, функция может изменять объект без необходимости возвращать измененный объект.
Например, предположим, что вы изменяете SimpleClass определение класса, чтобы сделать класс производным от handle класс:
classdef SimpleHandleClass < handle properties Color end methods function obj = SimpleHandleClass(c) if nargin > 0 obj.Color = c; end end end end
Создание экземпляра SimpleHandleClass, присваивая значение red к Color свойство:
obj = SimpleHandleClass('red');
Передача объекта функции g, которая присваивает blue в Color свойство:
y = g(obj);
Функция g устанавливает Color свойство объекта, на который ссылается как возвращенный дескриптор, так и исходный дескриптор:
y.Color
ans = blue
obj.Color
ans = blue
Переменные y и obj см. один и тот же объект:
y.Color = 'yellow';
obj.Colorans = yellow
Функция g изменил объект, на который ссылается входной аргумент (obj) и вернул дескриптор этому объекту в y.
MATLAB передает дескрипторы по значению. Переменная дескриптора является ссылкой на объект. MATLAB передает эту ссылку по значению.
Маркеры не ведут себя как ссылки в C++. Если передать дескриптор объекта функции и эта функция назначит другой объект этой переменной-дескриптору, переменная в вызывающей стороне не будет затронута. Например, предположим, что вы определяете функцию g2:
function y = g2(x) x = SimpleHandleClass('green'); y = x; end
Передать объект-дескриптор g2:
obj = SimpleHandleClass('red');
y = g2(obj);
y.Colorans = green
obj.Color
ans = red
Функция перезаписывает переданный дескриптор в качестве аргумента, но не перезаписывает объект, на который ссылается дескриптор. Исходный дескриптор obj по-прежнему ссылается на исходный объект.
В MATLAB классы могут определять постоянные свойства, но не «статические» свойства в смысле других языков, таких как C++. Невозможно изменить свойства константы из начального значения, указанного в определении класса.
MATLAB имеет давние правила, согласно которым переменные всегда имеют приоритет над именами функций и классов. Операторы присваивания вводят переменную, если она не существует.
Выражения этой формы
A.B = C
Ввести новую переменную, A, то есть struct содержащий поле B значение которого - C. Если A.B = C может ссылаться на статическое свойство класса A, затем класс A будет иметь приоритет над переменной A.
Такое поведение было бы значительной несовместимостью с предыдущими выпусками MATLAB. Например, введение класса с именем A на пути MATLAB может изменить значение оператора назначения, как A.B = C внутри .m файл кода.
В других языках классы редко используют статические данные, за исключением частных данных внутри класса или открытых констант. В MATLAB можно использовать постоянные свойства аналогично public
final
static поля на Java. Для использования внутренних данных класса в MATLAB создайте постоянные переменные в частных или защищенных методах или локальных функциях, используемых в частном порядке классом.
Избегайте статических данных в MATLAB. Если класс имеет статические данные, использование одного и того же класса в нескольких приложениях вызывает конфликты между приложениями. Конфликты в меньшей степени являются проблемой на некоторых других языках. Эти языки компилируют приложения в исполняемые файлы, которые выполняются в различных процессах. Каждый процесс имеет собственную копию статических данных класса. MATLAB часто запускает множество различных приложений в одном процессе и среде с одной копией каждого класса.
Способы определения и использования статических данных в MATLAB см. в разделе Статические данные.
Эта таблица содержит ссылки на разделы, в которых рассматриваются объектно-ориентированные методы, обычно используемые в других объектно-ориентированных языках.
| Техника | Использование в MATLAB |
|---|---|
| Перегрузка оператора | Перегрузка оператора |
| Множественное наследование | Подкласс нескольких классов |
| Подклассификация | Конструкторы подкласса проектирования |
| Деструктор | Деструктор класса дескриптора |
| Область действия элемента данных | Атрибуты свойства |
| Пакеты (классы определения объема) | Пакеты создают пространства имен |
| Именованные константы | См. раздел Определение свойств класса с постоянными значениями и именованными значениями |
| Перечисления | Определение классов перечисления |
| Статические методы | Статические методы |
| Статические свойства | Не поддерживается. Посмотрите Сведения о изменяемых статических данных см. в разделе Статические данные |
| Конструктор | Методы конструктора классов |
| Конструктор копирования | Прямой эквивалент отсутствует |
| Справочные/справочные классы | Сравнение классов дескрипторов и значений |
| Абстрактный класс/интерфейс | Абстрактные классы и члены классов |
| Вывоз мусора | Жизненный цикл объекта |
| Свойства экземпляра | Динамические свойства - добавление свойств к экземпляру |
| Импорт классов | Импортировать классы |
| События и слушатели | Концепции событий и слушателей |