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

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

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

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

Класс, чтобы Управлять uint8 Данными

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

Класс 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);

Похожие темы