Сравнение MATLAB и других языков OO

Некоторые различия от кода C++ и Java

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)Пакеты создают пространства имен
Именованные константыСм. «Определение свойств классов с постоянными значениями и именованными значениями»
ПеречисленияЗадайте классы перечисления
Статические методыСтатические методы
Статические свойства

Не поддерживается. Посмотрите persistent переменные. Для эквивалента Java- static final или C++ static const свойства, использование Constant свойства. Смотрите Задать Свойства Класса с Постоянными Значениями

Для мутабельных статических данных смотрите Статические данные

КонструкторМетоды конструктора классов
Копировать конструкторНет прямого эквивалента
Классы ссылок/ссылокСравнение классов Handle и Value
Абстрактный класс/интерфейсАбстрактные классы и члены класса
Мусорные наборыЖизненный цикл объекта
Свойства образцаДинамические свойства - добавление свойств к образцу
Импорт классовИмпортируйте классы
События и прослушивателиСобытие и Концепции прослушивателя