Язык программирования 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 называет тот же объект исходной переменной. Если функция изменяет объект указателя, переданный как входной параметр, модификация влияет на объект, на который оба ссылаются исходные и скопированные указатели.
Классы значения — данные о свойстве в экземпляре класса значения независимы от данных о свойстве в копиях того экземпляра (несмотря на то, что, свойство класса значения могло содержать указатель). Функция может изменить объект значения, который передается как входной параметр, но эта модификация не влияет на исходный объект.
Смотрите Сравнение Классов Указателя и Значения для получения дополнительной информации о поведении и использовании обоих видов классов.
Передающие Объекты Значения. Когда вы передаете объект значения функции, функция создает локальную копию переменной аргумента. Функция может изменить только копию. Если вы хотите изменить исходный объект, возвратите измененный объект и присвойте его исходному имени переменной. Например, рассмотрите класс значения, 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 Значением. Переменная указателя является ссылкой на объект. 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 |
Определение объема элемента данных | Атрибуты свойств |
Пакеты (определяющий объем классов) | Пакеты создают пространства имен |
Названные константы | Смотрите задают свойства класса с постоянными значениями и названными значениями |
Перечисления | Определение классов перечисления |
Статические методы | Статические методы |
Static Properties | Не поддерживаемый. Переменные See Для изменяемых статических данных смотрите Статические Данные |
Конструктор | Методы конструктора класса |
Копирование конструктора | Никакой прямой эквивалент |
Ссылка/классы ссылки | Сравнение классов указателя и значения |
Абстрактный класс,/Interface | Абстрактные классы |
Сборка мусора | Объектный жизненный цикл |
Свойства экземпляра | Динамические свойства - Adding Properties к экземпляру |
Импорт классов | Импорт классов |
События и прослушиватели | Событие и Концепции прослушивателя |