Большинство встроенных функций, используемых со встроенными классами, является на самом деле методами встроенного класса. Например, double
и классы single
задают несколько методов, чтобы выполнить арифметические операции, индексацию, операцию над матрицей, и так далее. Все эти встроенные методы класса работают с подклассами встроенного класса.
Разделение на подклассы double
позволяет вашему классу использовать функции, не реализовывая методы, которые задает MATLAB® встроенный класс.
Класс DocSimpleDouble
разделяет на подклассы встроенный класс double
.
classdef DocSimpleDouble < double methods function obj = DocSimpleDouble(data) if nargin == 0 data = 0; end obj = obj@double(data); end end end
Создайте экземпляр класса DocSimpleDouble
.
sc = DocSimpleDouble(1:10)
sc = 1x10 DocSimpleDouble: double data: 1 2 3 4 5 6 7 8 9 10
Вызовите метод double
, унаследованный от класса, который работает с данными, такими как sum
. sum
возвращает double
и, поэтому, использует метод display
класса double
:
sum(sc)
ans = 55
Индексируйте sc
как массив, удваивается. Возвращенное значение является классом подкласса:
a = sc(2:4)
a = 1x3 DocSimpleDouble: double data: 2 3 4
Индексируемое присвоение работает то же самое встроенным классом. Возвращенное значение является классом подкласса:
sc(1:5) = 5:-1:1
sc = 1x10 DocSimpleDouble: double data: 5 4 3 2 1 6 7 8 9 10
Вызов метода, который изменяет порядок элементов данных, работает с данными, но возвращает объект подкласса:
sc = DocSimpleDouble(1:10); sc(1:5) = 5:-1:1; a = sort(sc)
a = 1x10 DocSimpleDouble: double data: 1 2 3 4 5 6 7 8 9 10
Когда вы вызываете встроенный метод значения данных на объекте подкласса, MATLAB использует часть суперкласса объекта подкласса как входные параметры к методу. Возвращенное значение является тем же классом как встроенный класс. Например:
sc = DocSimpleDouble(1:10); a = sin(sc); class(a)
ans = double
Эта группа встроенных методов переупорядочивает или изменяет размерность массива входного параметра. Эти методы работают с частью суперкласса объекта подкласса, но возвращают объект того же типа как подкласс.
sc = DocSimpleDouble(randi(9,1,10))
sc = DocSimpleDouble(randi(9,1,10)) sc = 1x10 DocSimpleDouble: double data: 6 1 8 9 7 7 7 4 6 2
b = sort(sc)
b = 1x10 DocSimpleDouble: double data: 1 2 4 6 6 7 7 7 8 9
Методы в этой группе включают:
Встроенные классы используют специально реализованные версии subsref
, subsasgn
и методов subsindex
, чтобы реализовать индексацию. Когда вы индексируете объект подкласса, только на встроенные данные ссылаются (не свойства, заданные вашим подклассом).
Например, индексируя элемент 2
в объекте подкласса DocSimpleDouble
возвращает второй элемент в векторе:
sc = DocSimpleDouble(1:10); a = sc(2)
a = DocSimpleDouble double data: 2
Значение, возвращенное от операции индексации, является объектом подкласса. Вы не можете сделать индексированные ссылки, если ваш подкласс задает свойства, если ваш подкласс не заменяет метод subsref
по умолчанию.
Присвоение нового значения к второму элементу в объекте DocSimpleDouble
работает только с данными о суперклассе:
sc(2) = 12
sc = 1x10 DocSimpleDouble: double data: 1 12 3 4 5 6 7 8 9 10
Метод subsref
также реализует запись через точку для методов.
Встроенные классы используют функции horzcat
, vertcat
и cat
, чтобы реализовать конкатенацию. Когда вы используете эти функции с объектами подкласса того же типа, MATLAB конкатенирует данные о суперклассе, чтобы сформировать новый объект. Например, можно конкатенировать объекты класса DocSimpleDouble
:
sc1 = DocSimpleDouble(1:10); sc2 = DocSimpleDouble(11:20); [sc1,sc2]
ans = 1x20 DocSimpleDouble: double data: Columns 1 through 13 1 2 3 4 5 6 7 8 9 10 11 12 13 Columns 14 through 20 14 15 16 17 18 19 20
[sc1;sc2]
ans = 2x10 DocSimpleDouble: double data: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Конкатенация двух объектов по третьему измерению:
c = cat(3,sc1,sc2)
c = 1x10x2 DocSimpleDouble: double data: (:,:,1) = 1 2 3 4 5 6 7 8 9 10 (:,:,2) = 11 12 13 14 15 16 17 18 19 20
Если подкласс встроенного класса задает свойства, вы не можете конкатенировать объекты подкласса. Нет никакого способа определить, как комбинировать свойства различных объектов. Однако ваш подкласс может задать пользовательский horzcat
, и методы vertcat
, чтобы поддержать конкатенацию любым способом целесообразен для вашего подкласса.