Встроенные числовые типы подкласса для создания настроенных типов данных, наследующих функциональность встроенного типа. Добавление или изменение функциональности суперкласса с помощью методов класса.
Предоставление дополнительного хранилища данных в подклассе путем определения свойств может быть полезным расширением для встроенного класса данных. Однако для сложения свойств к подклассу требуется, чтобы подкласс определил методы для реализации стандартного поведения массивов.
Для получения дополнительной информации смотрите Подклассы встроенных типов 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
.
disp
— ExtendDouble
реализует 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
и заметьте, что отображение отличается от по умолчанию:
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
класс.
Создайте два объекта:
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
возвращает новый объект того же класса, что и подкласс.