В этом примере показано, как настроить операции индексации точки в ScalarStructClass
. Экземпляры ScalarStructClass
ведите себя во многом как структуры. Пользователи могут динамически добавить поля и присваиваемые значения как struct, но класс также служит основой, к которой могут быть добавлены дополнительные свойства и методы.
Класс наследовался matlab.mixin.Scalar
, что означает, что его экземпляры являются скалярными объектами. Единственный возможный размер массивов 1 на 1, и экземпляры не могут быть конкатенированы. Класс также наследовался matlab.mixin.indexing.RedefinesDot
и реализует его абстрактные методы обработать операции индексации точки:
dotReference
: Указатели отмечают точкой ссылки в частный AddedFields
свойство. Синтаксис instance.fieldname
возвращает значение, присвоенное полю ссылок.
dotAssign
: Добавляют новое поле и соответствующее значение к AddedFields
свойство. Синтаксис instance.fieldname
= value
добавляют поле и его соответствующее значение.
dotListLength
: Определяет количество значений, чтобы возвратиться из выражений индексации точки что возвращаемые значения от или значения присвоения к списку, разделенному запятыми.
Класс также задает getAddedFields
метод, который возвращает список всех полей и соответствующих значений.
ScalarStructClass
Код
classdef ScalarStructClass < matlab.mixin.indexing.RedefinesDot & ...
matlab.mixin.Scalar
properties (Dependent, SetAccess=private)
FieldNames
end
properties (Access=private)
AddedFields struct
end
methods
function out = get.FieldNames(obj)
out = string(fieldnames(obj.AddedFields));
end
end
methods (Access=public)
function obj = ScalarStructClass(fieldName,fieldValue)
if nargin == 1
obj.AddedFields = fieldName;
return;
end
obj.AddedFields = struct(fieldName,fieldValue);
end
function out = getAddedFields(obj)
out = obj.AddedFields;
end
end
methods (Access=protected)
function varargout = dotReference(obj,indexOp)
[varargout{1:nargout}] = obj.AddedFields.(indexOp);
end
function obj = dotAssign(obj,indexOp,varargin)
[obj.AddedFields.(indexOp)] = varargin{:};
end
function n = dotListLength(obj,indexOp,indexContext)
n = listLength(obj.AddedFields,indexOp,indexContext);
end
end
end
Используйте ScalarStructClass
Экземпляр
Создайте ScalarStructClass
экземпляр с одним полем и соответствующим значением.
myStructClass =
ScalarStructClass with properties:
FieldNames: "Field1"
Добавьте второе поле в экземпляр с помощью точечного присвоения. dotAssign
метод принимает IndexingOperation
объект, который описывает тип индексации операции (Dot
) и имя поля и второй аргумент, который содержит значение нового поля.
Используйте запись через точку, чтобы проверить значение Field2
. Как dotAssign
, dotReference
метод принимает IndexOperation
объект, который идентифицирует что поле для доступа.
Используйте getAddedFields
видеть полный список полей и значений.
ans = struct with fields:
Field1: 75
Field2: 10
ScalarStructClass
также присвоение списка, разделенного запятыми поддержек и ссылка. Добавьте третье поле в myStructClass
это содержит массив ячеек.
Доступ к CellArray
поле . Класс вызывает dotReference
метод и возвращает несколько выходных параметров.
Присвойте несколько новых значений CellArray
поле . Поскольку операция присвоения начинается с точечной ссылки и заканчивается индексом фигурной скобки, класс вызывает dotListLength
метод в дополнение к dotAssign
обрабатывать операцию присвоения.
ans=1×2 cell array
{[5]} {[6]}