Customize isequal behavior for handle objects?

7 visualizaciones (últimos 30 días)
Thomas Kiefer
Thomas Kiefer el 2 de En. de 2020
Comentada: Thomas Kiefer el 3 de En. de 2020
Is it possible to customize the isequal function for own classes, i.e. to define when two handle-class objects are considered as equal by content? I would like to explain my question in more detail below:
Please consider the following simple data class
classdef Data < handle
properties
value
end
methods
function self = Data(value)
self.value = value;
end
end
end
Following MathWorks --- Equality of Handle Objects one can check if two objects of the Data class point to the same reference using the == operator. In contrast, one can test if two objects are equal by content using the Matlab built-in isequal function.
This works fine. However, I now would like to override the isequal behaviour for my class. For example, I would like to define that two Data objects are equal by content if the values of their property value are equal within an absolute tolerance of 1e-8. How could I achieve that?
Note:
Im aware of the possibility of overriding the eq-method of the Data class:
classdef Data < handle
properties
value
end
methods
function self = Data(value)
self.value = value;
end
function is_eq = eq(self, other)
if not(strcmp(class(self), class(other)))
is_eq = false;
return
end
is_eq = abs(self.value - other.value) < 1e-8;
end
end
end
Therewith I can test the equality of two objects by content using the == operator. However, from my point of view this is problematic because: i) It is inconsistent with the initial/previous behavior because the == operator no longer compares two objects by reference but by content instead. And, ii) in addition, I lose the possiblity to check if two objects have the same reference.

Respuesta aceptada

Steven Lord
Steven Lord el 2 de En. de 2020
If you want to overload what isequal means for your object, overload isequal.
isequal and eq are somewhat related, but they are independent functions.
  1 comentario
Thomas Kiefer
Thomas Kiefer el 2 de En. de 2020
I wasn't aware about the fact isequal could be overload for own classes. Thank you very much!

Iniciar sesión para comentar.

Más respuestas (1)

Thomas Kiefer
Thomas Kiefer el 3 de En. de 2020
One more subsequent question: When overriding isequal in a custom class, i.e. in the Data class, how could one access the previous definition of isequal (as if I would not have overriden the method)? Because isequal is not a member method of the base class handle.
I.e., what I would like to do in my custom isequal method is to make some quick checks on the objects by which I can verfiy that the objects are different and only if these checks are passed use the full isequal-test. Like that:
classdef Data < handle
properties
value
end
methods
function self = Data(value)
self.value = value;
end
function is_eq = isequal(self, other)
%% Make some user specific tests
%% Which help to quickly decide if self and
% other are unequal
%...
%...
%% If all criteria above are fulfilled use the
%% Matlab default isequal... like isequal@superclass(self, other)
is_equal = isequal(self, other);
end
end
end
  2 comentarios
Walter Roberson
Walter Roberson el 3 de En. de 2020
builtin('isequal', self, other)
Thomas Kiefer
Thomas Kiefer el 3 de En. de 2020
Great! That solves my problem. Thank you very much!

Iniciar sesión para comentar.

Categorías

Más información sobre Class Introspection and Metadata en Help Center y File Exchange.

Productos


Versión

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by