MATLAB® язык программирования отличается от других объектно-ориентированных языков, таких как C++ или Java® в некоторых важных отношениях.
В отличие от полей на C++ или языке Java, можно использовать свойства MATLAB для определения открытого интерфейса, отдельного от реализации хранения данных. Вы можете предоставить общедоступный доступ к свойствам, потому что можете задать и получить методы доступа, которые выполняются автоматически при назначении или запросе значений свойств. Для примера, следующее заявление:
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 поддерживает два вида классов, которые ведут себя по-разному при копировании:
Классы Handle - переменная образца класса handle ссылается на объект. Копия переменной образца класса handle ссылается на тот же объект, что и исходная переменная. Если функция изменяет объект-указатель, переданный как входной параметр, изменение влияет на объект, на который ссылаются как исходные, так и скопированные указатели.
Классы значений - данные свойств в образце класса значений не зависят от данных свойств в копиях этого образца (хотя свойство класса значений может содержать указатель). Функция может изменять объект значения, который передается как входной параметр, но это изменение не влияет на исходный объект.
Смотрите Сравнение классов Handle и Value для получения дополнительной информации о поведении и использовании обоих видов классов.
Передача объектов значения. Когда вы передаете объект значения функции, функция создает локальную копию переменной аргумента. Функция может изменять только копий.Если вы хотите изменить исходный объект, верните измененный объект и присвойте ему имя исходной переменной. Например, рассмотрим класс значений, 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 = blue
obj.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.Color
ans = yellow
Функция g
изменил объект, на который ссылается входной параметр (obj
) и вернул указатель на этот объект в y
.
MATLAB передает указатели по значению. Переменная handle является ссылкой на объект. MATLAB передает эту ссылку по значению.
Указатели ведут себя не так, как ссылки на C++. Если вы передаете указатель на объект в функцию, и эта функция присваивает другой объект этой переменной на указатель, переменная в вызывающем абоненте не затрагивается. Например, предположим, что вы задаете функцию g2
:
function y = g2(x) x = SimpleHandleClass('green'); y = x; end
Передайте указатель объекта, чтобы g2
:
obj = SimpleHandleClass('red');
y = g2(obj);
y.Color
ans = 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 |
---|---|
Перегрузка операторов | Перегрузка операторов |
Множественное наследование | Подклассирование нескольких классов |
Подклассификация | Проект конструкторов подкласса |
Деструктор | Класс Handle |
Область видимости представителей данных | Атрибуты свойств |
Пакеты (классы scoping) | Пакеты создают пространства имен |
Именованные константы | См. «Определение свойств классов с постоянными значениями и именованными значениями» |
Перечисления | Задайте классы перечисления |
Статические методы | Статические методы |
Статические свойства | Не поддерживается. Посмотрите Для мутабельных статических данных смотрите Статические данные |
Конструктор | Методы конструктора классов |
Копировать конструктор | Нет прямого эквивалента |
Классы ссылок/ссылок | Сравнение классов Handle и Value |
Абстрактный класс/интерфейс | Абстрактные классы и члены класса |
Мусорные наборы | Жизненный цикл объекта |
Свойства образца | Динамические свойства - добавление свойств к образцу |
Импорт классов | Импортируйте классы |
События и прослушиватели | Событие и Концепции прослушивателя |