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

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

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

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

Класс для управления данными uint8

В этом примере показан класс, полученный из встроенного uint8 класс. Этот класс упрощает процесс поддержания набора данных изображений интенсивности, заданных uint8 значения. Основные операции класса включают:

  • Возможность преобразовать различные классы данных изображений в uint8 чтобы уменьшить объем хранения данных объекта.

  • Метод для отображения изображений интенсивности, содержащихся в объектах подкласса.

  • Возможность использовать все методы, поддерживаемые uint8 данные (для примера, size, индексация, reshape, bitshift, cat, fft, арифметические операторы и так далее).

Данные класса являются матрицами данных изображений интенсивности, сохраненными в части суперкласса объекта подкласса. Этот подход не требует никаких свойств.

The 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 объектов

The 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 объект, так называемый showImage выдает ошибку:

a = img1.*1.8;
showImage(a);
Check for missing argument or incorrect argument data type in call to function 'showImage'.

Чтобы выполнить операции этого типа, реализуйте подкласс метода, чтобы переопределить унаследованный метод. The 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);

Похожие темы