exponenta event banner

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

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

Язык программирования 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 =

    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
Перегрузка оператораПерегрузка оператора
Множественное наследованиеПодкласс нескольких классов
ПодклассификацияКонструкторы подкласса проектирования
ДеструкторДеструктор класса дескриптора
Область действия элемента данныхАтрибуты свойства
Пакеты (классы определения объема)Пакеты создают пространства имен
Именованные константыСм. раздел Определение свойств класса с постоянными значениями и именованными значениями
ПеречисленияОпределение классов перечисления
Статические методыСтатические методы
Статические свойства

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

Сведения о изменяемых статических данных см. в разделе Статические данные

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