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

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

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

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

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

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

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

  • Метод, чтобы отобразить изображения интенсивности, содержавшиеся в объектах подкласса.

  • Способность использовать все методы, поддержанные uint8 данные (например, size, индексация, reshapeсдвиг разряда\catfft, арифметические операторы, и так далее).

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

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 объекты, потому что этот класс наследовал 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'.

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

Похожие темы