Большинство встроенных функций, используемых со встроенными классами, является на самом деле методами встроенного класса. Например, 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сумма возвращает 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 2b = sort(sc)
b =
1x10 DocSimpleDouble:
double data:
1 2 4 6 6 7 7 7 8 9Методы в этой группе включают:
Встроенные классы используют специально реализованные версии subsrefsubsasgn, и 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 метод также реализует запись через точку для методов.
Встроенные классы используют функции horzcatvertcat, и 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 методы, чтобы поддержать конкатенацию любым способом целесообразны для вашего подкласса.