Поведение наследованных встроенных методов

Подкласс дважды

Большинство встроенных функций, используемых со встроенными классами, является на самом деле методами встроенного класса. Например, 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 как массив типа double. Возвращенное значение является классом подкласса:

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 методы, чтобы поддержать конкатенацию любым способом целесообразны для вашего подкласса.

Похожие темы