是否可以检查重载 eq 的类的句柄是否相等?

Is it possible to check for handle equality for a class that overloads eq?

提问人:Will 提问时间:11/19/2019 最后编辑:CommunityWill 更新时间:11/19/2019 访问量:75

问:

我的代码有一些属于第三方类的对象的句柄,我无法修改这些句柄。此类重载,因此,它不会像内置版本那样比较句柄是否指向同一对象,而是根据输入对象的值进行不同的比较,而不管是否为同一对象提供两个句柄。eq==

我明确地想检查两个句柄是否指向同一个对象。我想也许会救我。但只会导致错误:builtinbuiltin('eq',A,B)

使用内置时出错

未定义的运算符“==”,用于类型为“ThirdPartyClass”的输入参数。

它似乎只喜欢“纯”函数,并且是类的一种特殊方法,与对纯函数进行操作的内置函数不同。builtinhandle.eqhandleeq

使用类名显式调用也不起作用 - 这会产生错误eqhandle.eq(A,B)

没有为类“handle”找到具有匹配签名的方法“eq”。

奇怪的是,使用相同的语法调用重载会产生不同的错误:ThirdPartyClass.eq(A,B)

类 ThirdPartyClass 没有名为“eq”的 Constant 属性或 Static 方法。

因此,我并不完全清楚是否也必然被解释为对静态方法的调用。但至少在这种确切的形式下,它似乎不是调用(重载的)常规方法的可行途径。handle.eq(A,B)

那么,我是否被这门课的作者非常不周到的设计选择所困扰?或者有没有办法访问如此鲁莽地重载的超类的方法?或者,实际上,一种从头开始实现目标的方法(尽管这是 MATLAB 的内置函数之一,其实现在 m 代码中不可见)?handle.eq

MATLAB 重载 句柄 比较运算符

评论

1赞 Cris Luengo 11/19/2019
我自己没有试过这个,可以打电话吗?从派生类中,您通常会这样做,但我认为这不适用于类方法之外。handle.eq(A,B)method@parentClass()
0赞 Luis Mendo 11/19/2019
有用吗?isequal(A, B)
0赞 Will 11/19/2019
@CrisLuengo不 - 我实际上已经尝试过这个,但它不起作用。我在问题中添加了这方面的细节。 当然更直接 - 它会导致错误,无论如何,这就是文档明确说明该语法的内容。method@parentClass()A base class method can only be called from the same method in a subclass.
1赞 Will 11/19/2019
@LuisMendo 的行为与 完全不同。它检查 和 的属性值是否相等,无论它们是否属于同一个对象实例,如文档的提示部分所述,两者和handle.isequalhandle.eqABeqisequal

答:

1赞 Will 11/19/2019 #1

通过查看公共处理方法列表,得出了一个在这种情况下可行的解决方案。由于 和 在此类中重载,因此表达式的结果与处理类的结果相同,而没有重载。legeA <= B & A >= BA == Beq

评论

0赞 Will 11/19/2019
当然,这取决于手头类的特殊性,因此我仍然对任何直接绕过方法重载影响的解决方案感兴趣。我会推迟几天接受这个答案,以防出现更令人满意的答案。