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

Специализированные числовые типы с дополнительным хранением данных

Встроенные числовые типы подкласса для создания настроенных типов данных, наследующих функциональность встроенного типа. Добавление или изменение функциональности суперкласса с помощью методов класса.

Предоставление дополнительного хранилища данных в подклассе путем определения свойств может быть полезным расширением для встроенного класса данных. Однако для сложения свойств к подклассу требуется, чтобы подкласс определил методы для реализации стандартного поведения массивов.

Для получения дополнительной информации смотрите Подклассы встроенных типов MATLAB.

Подклассы со свойствами

Когда подкласс встроенного класса задает свойства, индексация по умолчанию и конкатенация не работают. Дефолт subsref, subsasgn, horzcat, и vertcat функции не могут работать с неизвестными типами свойств и значениями. Поэтому подкласс должен задать это поведение путем реализации этих методов.

Этот пример реализации ExtendDouble класс выводится из double Класс и определяет одно свойство. The ExtendDouble определение класса демонстрирует, как реализовать индексацию и конкатенацию для подклассов встроенных классов

Свойство добавлено

The ExtendDouble класс задает DataString свойство, содержащее текст, описывающий данные. Часть класса суперкласса содержит числовые данные.

Реализованные методы

Следующие методы изменяют поведение ExtendDouble класс:

  • ExtendDouble - Конструктор поддерживает синтаксис без аргументов, который инициализирует свойства до пустых значений.

  • subsref - Включает привязанную ссылку на суперкласс части подкласса, запись через точку на DataString свойство и запись через точку ссылаются на встроенные данные через имя Data.

  • subsasgn - Включает подписанное назначение суперклассовой части подкласса, ссылку на запись через точку на DataString свойство и запись через точку ссылаются на встроенные данные через имя Data.

  • horzcat - Определяет горизонтальную конкатенацию ExtendDouble объекты. конкатенирует часть суперкласса с помощью double классы horzcat метод и формирует массив ячеек DataString свойства.

  • vertcat - Эквивалент вертикальной конкатенации horzcat (оба требуются).

  • char - A ExtendDouble на char конвертер, используемый horzcat и vertcat.

  • dispExtendDouble реализует disp метод, обеспечивающий пользовательское отображение для объекта.

Код определения класса

The ExtendDouble класс расширяется double и реализует методы для поддержки индексации и конкатенации под индексами.

classdef ExtendDouble < double
   
   properties
      DataString
   end
   
   methods
      function obj = ExtendDouble(data,str)
         if nargin == 0
            data = 0;
            str = '';
         elseif nargin == 1
            str = '';
         end
         obj = obj@double(data);
         obj.DataString = str;
      end
      
      function sref = subsref(obj,s)
         switch s(1).type
            case '.'
               switch s(1).subs
                  case 'DataString'
                     sref = obj.DataString;
                  case 'Data'
                     d = double(obj);
                     if length(s)<2
                        sref = d;
                     elseif length(s)>1 && strcmp(s(2).type,'()')
                        sref = subsref(d,s(2:end));
                     end
                  otherwise
                     error('Not a supported indexing expression')
               end
            case '()'
               d = double(obj);
               newd = subsref(d,s(1:end));
               sref = ExtendDouble(newd,obj.DataString);
            case '{}'
               error('Not a supported indexing expression')
         end
      end
      
      function obj = subsasgn(obj,s,b)
         switch s(1).type
            case '.'
               switch s(1).subs
                  case 'DataString'
                     obj.DataString = b;
                  case 'Data'
                     if length(s)<2
                        obj = ExtendDouble(b,obj.DataString);
                     elseif length(s)>1 && strcmp(s(2).type,'()')
                        d = double(obj);
                        newd = subsasgn(d,s(2:end),b);
                        obj = ExtendDouble(newd,obj.DataString);
                     end
                  otherwise
                     error('Not a supported indexing expression')
               end
            case '()'
               d = double(obj);
               newd = subsasgn(d,s(1),b);
               obj = ExtendDouble(newd,obj.DataString);
            case '{}'
               error('Not a supported indexing expression')
         end
      end
      
      function newobj = horzcat(varargin)
         d1 = cellfun(@double,varargin,'UniformOutput',false );
         data = horzcat(d1{:});
         str = horzcat(cellfun(@char,varargin,'UniformOutput',false));
         newobj = ExtendDouble(data,str);
      end
      
      function newobj = vertcat(varargin)
         d1 = cellfun(@double,varargin,'UniformOutput',false );
         data = vertcat(d1{:});
         str = vertcat(cellfun(@char,varargin,'UniformOutput',false));
         newobj = ExtendDouble(data,str);
      end
      
      function str = char(obj)
         str = obj.DataString;
      end
      
      function disp(obj)
         disp(obj.DataString)
         disp(double(obj))
      end
   end
end

Использование ExtendDouble

Создайте образец ExtendDouble и заметьте, что отображение отличается от по умолчанию:

ed = ExtendDouble(1:10,'One to ten')
ed = 

One to ten
     1     2     3     4     5     6     7     8     9    10

Унаследованные методы

The ExtendDouble класс наследует методы от класса double. Чтобы увидеть список всех общедоступных методов, определенных классом double, используйте methods функция:

methods(double.empty)

sum функция продолжает работать с суперклассовой частью объекта:

sum(ed)
ans =
    55

sort функция работает с суперклассовой частью объекта:

sort(ed(10:-1:1))
ans = 

     1     2     3     4     5     6     7     8     9    10

Арифметические операторы работают с суперклассовой частью объекта:

ed.^2
ans =

     1     4     9    16    25    36    49    64    81   100

Индексирование по подписке

Потому что ExtendDouble класс задает свойство, класс должен реализовать собственное subsref и subsasgn методы.

Этот класс реализует следующие подписанные выражения индексации для ссылки и назначения.

  • obj.DataString - доступ к DataString свойство.

  • obj.Data, obj.Data(ind) - доступ к данным с помощью ссылки на стиль свойств. Ссылка возвращает значения типа double.

  • obj(ind) - доступ к числовым данным (таким же, как obj.Data(ind)). Ссылка возвращает значения типа ExtendDouble.

Класс subsref метод позволяет использовать ExtendDouble объекты, такие как числовые массивы для ссылки на числовые данные:

ed = ExtendDouble(1:10,'One to ten');
ed(10:-1:1)
ans = 

One to ten
    10     9     8     7     6     5     4     3     2     1

Доступ к числовым данным ExtendDouble использование индексации в стиле свойств с произвольно выбранным именем Data:

ed.Data(10:-1:1)
ans = 

One to ten
    10     9     8     7     6     5     4     3     2     1

Доступ к DataString свойство:

ed.DataString
ans =

One to ten

Подписанное назначение реализует аналогичный синтаксис в subsasgn классов способ.

ed = ExtendDouble(1:10,'One to ten');
ed(11:13) = [11,12,13];
ed.DataString = 'one to thirteen';
ed
ed = 

One to thirteen'
     1     2     3     4     5     6     7     8     9    10    11    12    13

The ExtendDouble наследует методы конвертера от класса double. Для примера, MATLAB® вызывает char метод для выполнения этого оператора назначения.

ed(11:13) = ['a','b','c']
ed = 

one to thirteen
     1     2     3     4     5     6     7     8     9    10    97    98    99

Класс значения, возвращенный выражением индексации

The ExtendDouble реализует две формы индексированной ссылки в subsref метод:

  • obj.Data и obj.Data(ind) - Возвращает значения классов double

  • obj(ind) - Возвращает значения классов ExtendDouble

Например, сравните значения, возвращенные этими выражениями.

ed = ExtendDouble(1:10,'One to ten');
a = ed(1)
a = 

One to ten
     1
b = ed.Data(1)
b =

     1
whos
  Name      Size            Bytes  Class           Attributes

  a         1x1               132  ExtendDouble              
  b         1x1                 8  double                    
  ed        1x10              204  ExtendDouble              

Повышенная гибкость реализации индексированной ссылки в ExtendDouble класс.

Конкатенация объектов ExtendDouble

Создайте два объекта:

ed1 = ExtendDouble([1:10],'One to ten');
ed2 = ExtendDouble([10:-1:1],'Ten to one');

Сгруппировать эти объекты по горизонтальной размерности:

hcat = [ed1,ed2]
hcat = 

    'One to ten'    'Ten to one'

  Columns 1 through 13

     1     2     3     4     5     6     7     8     9    10    10     9     8

  Columns 14 through 20

     7     6     5     4     3     2     1
whos
  Name      Size            Bytes  Class           Attributes

  ed1       1x10              204  ExtendDouble              
  ed2       1x10              204  ExtendDouble              
  hcat      1x20              528  ExtendDouble 

Вертикальная конкатенация работает аналогичным образом:

vcat = [ed1;ed2]
vcat = 

    'One to ten'    'Ten to one'

     1     2     3     4     5     6     7     8     9    10
    10     9     8     7     6     5     4     3     2     1

Оба horzcat и vertcat возвращает новый объект того же класса, что и подкласс.

Похожие темы