How to overload a single parentheses indexing operation, not all of them?
17 views (last 30 days)
Beginning in MATLAB R2021b it is possible to overload parentheses, dot, and brace indexing independently. This gives the ability to overload paren-indexing while preserving the default behavior and performance of dot-indexing for the class.
But if I try to implement a single operation I get the message
Abstract classes cannot be instantiated. Class 'Vec' inherits abstract methods or properties but does
not implement them. See the list of methods and properties that 'Vec' must implement if you do not
intend the class to be abstract.
Abstract methods for class Vec:
parenListLength % defined in matlab.mixin.indexing.RedefinesParen
parenDelete % defined in matlab.mixin.indexing.RedefinesParen
parenAssign % defined in matlab.mixin.indexing.RedefinesParen
parenReference % defined in matlab.mixin.indexing.RedefinesParen
empty % defined in matlab.mixin.indexing.RedefinesParen
cat % defined in matlab.mixin.indexing.RedefinesParen
size % defined in matlab.mixin.indexing.RedefinesParen
It seems overloading all of them is rather hairy and involved. Is there a way to provide just a single method that I need?
Matt J on 31 Dec 2021
Edited: Matt J on 31 Dec 2021
Here is a way to do it by overloading subsref. You might have to do the analogous implementation of subsasgn, if assignments are needed.
James Lebak on 3 Jan 2022
Edited: James Lebak on 3 Jan 2022
I would not do this by overloading indexing. As you point out, overloading indexing is difficult, and as Walter points out you should only overload indexing if you are really fundamentally changing the behavior of the object. It sounds to me like you want the objects to act like a default MATLAB object array but you want a convenient way to concatenate the properties.
You may be able to accomplish most of what you want by writing a method on your object that concatenates the values of the property into an array. For example,
function out = getValuesAsArray(obj)
out = [obj.values];
Then you could invoke the method on a subset of your array like so:
x = obj.getValuesAsArray(); % Concatenates all the values from the array
x = obj(1:10,:).getValuesAsArray() % Concatenates the values from the first 10 rows of every column