Разделите встроенные числовые типы на подклассы, чтобы создать настроенные типы данных, которые наследовали функциональность встроенного типа. Добавьте функциональность к обеспеченному суперклассом методами класса с реализацией. Подклассы без свойств хранят числовые данные как тип суперкласса. Если ваш дизайн подкласса не требует свойств хранить другие данные, реализация более проста, потому что вы не должны задавать методы индексации и конкатенации.
Для получения дополнительной информации смотрите Подклассы Встроенных типов MATLAB.
Этот пример показывает класс, выведенный от встроенного класса uint8
. Этот класс упрощает процесс поддержания набора данных изображения интенсивности, заданных значениями uint8
. Основные операции класса включают:
Возможность преобразовать различные классы данных изображения к uint8
, чтобы уменьшить устройство хранения данных данных объектов.
Метод, чтобы отобразить изображения интенсивности, содержавшиеся в объектах подкласса.
Способность использовать все методы, поддержанные данными uint8
(например, size
, индексация, reshape
, bitshift
, cat
, fft
, арифметические операторы, и так далее).
Данные класса являются матрицами данных изображения интенсивности, сохраненных в части суперкласса объекта подкласса. Этот подход не требует никаких свойств.
Класс DocUint8
хранит данные изображения, которые преобразовывают данные при необходимости:
classdef DocUint8 < uint8 methods function obj = DocUint8(data) if nargin == 0 data = uint8(0); end obj = obj@uint8(data); % Store data on superclass end function h = showImage(obj) data = uint8(obj); figure; colormap(gray(256)) h = imagesc(data,[0 255]); axis image brighten(.2) end end end
Класс DocUint8
предоставляет метод, чтобы отобразить все изображения, сохраненные, когда DocUint8
возражает сопоставимым способом. Например:
cir = imread('circuit.tif');
img1 = DocUint8(cir);
img1.showImage;
Поскольку DocUint8
разделяет на подклассы uint8
, можно использовать любые методы uint8
. Например,
size(img1)
ans = 280 272
возвращает размер данных изображения.
Унаследованные методы выполняют операции индексации, но возвращают объекты того же класса как подкласс.
Поэтому можно индексировать в данные изображения и вызвать метод подклассов:
showImage(img1(100:200,1:160));
Преобразованные в нижний индекс ссылочные операции (управляемый наследованным методом subsref
) возвращают объект DocUint8
.
Можно присвоить значения индексируемым элементам:
img1(100:120,140:160) = 255; img1.showImage;
Преобразованные в нижний индекс операции присвоения (управляемый наследованным методом subsasgn
) возвращают объект DocUint8
.
Операции конкатенации работают на объектах DocUint8
, потому что этот класс наследовал horzcat
uint8
и методы vertcat
, которые возвращают объект DocUint8
:
showImage([img1 img1]);
Методы, которые работают со значениями данных, такими как арифметические операторы, всегда возвращают объект встроенного типа (не типа подкласса). Например, умножение объектов DocUint8
возвращает объект uint8
:
a = img1.*1.8; showImage(a);
Undefined function 'showImage' for input arguments of type 'uint8'.
Чтобы выполнить операции этого типа, реализуйте метод подклассов заменить унаследованный метод. Метод times
реализует массив (поэлементно) умножение.
Добавьте этот метод к классу DocUint8
:
function o = times(obj,val) u8 = uint8(obj).*val; o = DocUint8(u8); end
Когда вы заменяете метод uint8
, MATLAB® вызывает метод подклассов, не метод базового класса. Метод подклассов должен:
Вызовите метод times
uint8
на данных объектов DocUint8
.
Создайте новый объект DocUint8
с помощью данных uint8
.
После добавления метода times
к классу DocUint8
вывод выражений умножения является объектом класса DocUint8
:
showImage(img1.*1.8);