exponenta event banner

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

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

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

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

Дополнительные сведения см. в разделе Подклассы встроенных типов MATLAB.

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

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

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

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

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

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

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

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

ExtendDouble класс наследует методы из класса 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

ExtendDouble наследует методы конвертера от двойного класса. Например, 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

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

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 возвращает новый объект того же класса, что и подкласс.

Связанные темы