Сравнение 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 называет тот же объект исходной переменной. Если функция изменяет объект указателя, переданный как входной параметр, модификация влияет на объект, на который оба ссылаются исходные и скопированные указатели.

  • Классы значения — данные свойства в экземпляре класса значения независимы от данных свойства в копиях того экземпляра (несмотря на то, что, свойство класса значения могло содержать указатель). Функция может изменить объект значения, который передается как входной параметр, но эта модификация не влияет на исходный объект.

Смотрите Сравнение Классов Указателя и Значения для получения дополнительной информации о поведении и использовании обоих видов классов.

Передающие Объекты Значения.  Когда вы передаете объект значения функции, функция создает локальную копию переменной аргумента. Функция может изменить только копию. Если вы хотите изменить исходный объект, возвратите измененный объект и присвойте его исходному имени переменной. Например, рассмотрите класс значения, 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 все еще ссылается на исходный объект.

Static Properties

В 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
Определение объема элемента данныхАтрибуты свойств
Пакеты (определяющий объем классов)Пакеты создают пространства имен
Названные константыСмотрите Define Class Properties с постоянными значениями и названными значениями
ПеречисленияОпределение классов перечисления
Статические методыСтатические методы
Static Properties

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

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

КонструкторМетоды конструктора класса
Копирование конструктораНикакой прямой эквивалент
Ссылка/классы ссылкиСравнение классов указателя и значения
Абстрактный класс,/InterfaceАбстрактные классы
Сборка мусораОбъектный жизненный цикл
Свойства экземпляраДинамические свойства - Adding Properties к экземпляру
Импорт классовИмпорт классов
События и прослушивателиСобытие и Концепции прослушивателя
Была ли эта тема полезной?