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

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

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

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