Разделите встроенные числовые типы на подклассы, чтобы создать настроенные типы данных, которые наследовали функциональность встроенного типа. Добавьте функциональность в обеспеченный суперклассом методами класса с реализацией. Подклассы без свойств хранят числовые данные как тип суперкласса. Если ваш проект подкласса не требует свойств хранить другие данные, реализация более проста, потому что вы не должны задавать методы индексации и конкатенации.
Для получения дополнительной информации смотрите Подклассы Встроенных типов MATLAB.
Этот пример показывает класс, выведенный из встроенного uint8
класс. Этот класс упрощает процесс поддержания набора данных изображения интенсивности, заданных uint8
значения. Основные операции класса включают:
Возможность преобразовать различные классы данных изображения к uint8
уменьшать устройство хранения данных данных объектов.
Метод, чтобы отобразить изображения интенсивности, содержавшиеся в объектах подкласса.
Способность использовать все методы, поддержанные uint8
данные (например, size
, индексация, reshape
сдвиг разряда
\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
объекты, потому что этот класс наследовал uint8
horzcat
и 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® вызывает метод подклассов, не метод базового класса. Метод подклассов должен:
Вызовите uint8
times
метод на DocUint8
данные объектов.
Создайте новый DocUint8
объект с помощью uint8
данные.
После добавления times
метод к DocUint8
класс, выход выражений умножения является объектом DocUint8
класс:
showImage(img1.*1.8);