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

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

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

Похожие темы

Была ли эта тема полезной?