How can I determine if one class is superior or inferior to another?

Matlab uses class precedence to determine which methods are called. Given two class names, is it possible to determine the class precedence relationship between the two? The new metaclass structure contains some of this information for classdef classes, but lacks information about older-style classes and fundamental types.
I'd love to find (or be able to write) a generic utility that simply asks is 'class_a' superior to 'class_b'? Is this possible?

 채택된 답변

Matt J
Matt J 2013년 10월 4일
편집: Matt J 2013년 10월 4일
Instead of having 2 class names, you can do it if you have 2 objects of the class using something like the function below. Moreover, if your class constructors all support the no-argument case, you could generate an object from a class name as follows
obj=feval(className)
but I don't know if this would always be true for you.
function tf=issuperior(A,B)
%True if class(A) superior to class(B). Otherwise false.
try
stupidname_neverused(A,B);
catch ME
end
name=strrep(ME.message,'Undefined function ''stupidname_neverused'' for input arguments of type ','');
name=strrep(name,'''','');
name(end)='';
tf=strcmp(name,class(A));

댓글 수: 6

Matt Bauman
Matt Bauman 2013년 10월 8일
편집: Matt Bauman 2013년 10월 8일
Very clever. What an ingenious way of getting at that information. Thanks! It's a shame Matlab doesn't expose this in a more sensible way; it'd make class precedence much more accessible and understandable.
Sounds like a worthwhile enhancement request to me!
Already done! I also spent a bit of time and flushed out your suggestion into a complete function: https://gist.github.com/mbauman/6888607. One note: it tests the relative precedence of the arguments, not necessarily if one class is superior to another. I have found that, for example, char and double are at equal precedence and the result is dependent upon their ordering.
I'm not sure of the distinction you're trying to draw, unless it's the distinction between strict superiority and "greater than or equal precendence". My function did test only the latter, so char and double which are of equal precedence should test true regardless of their order.
Yes, I was simply clarifying that the precedence is a function of both class and argument position. I was surprised by how many of the built-in types aren't at equal precedence... I don't think this is documented anywhere.
I'm not sure what's led you to conclude that the built-ins aren't of equal precedence, but maybe the docs your looking for are
and also maybe

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Cedric
Cedric 2013년 10월 4일
편집: Cedric 2013년 10월 5일
You could use property SuperclassList from the output of METACLASS recursively ..
Here is an example:
function tf = isSubclass( classObjMeta, superclassName )
tf = true ;
if ischar( classObjMeta ), classObjMeta = feval( classObjMeta ) ; end
if ~isa( classObjMeta, 'meta.class' )
classObjMeta = metaclass( classObjMeta ) ;
end
if strcmp( classObjMeta.Name, superclassName ), return ; end
for scId = 1 : length( classObjMeta.SuperclassList )
if isSubclass( classObjMeta.SuperclassList(scId), superclassName )
return
end
end
tf = false ;
end
Note that I just took 5 minutes to write that, so you'll want to stabilize or fine tune it. In particular, I leave it to you to modify it if you don't want the output to be true when you test a class with itself, .. or to ask users to pass an object as 1st arg if class doesn't support no-argument constructor (that should be tested in try/catch statement I guess).
To test it, define e.g.
classdef ClassA < handle
end
classdef ClassB < ClassA
end
and you'll have
>> isSubclass( 'ClassB', 'handle' )
ans =
1
>> isSubclass( 'ClassA', 'handle' )
ans =
1
>> isSubclass( 'ClassB', 'ClassA' )
ans =
1
>> isSubclass( 'ClassA', 'ClassB' )
ans =
0

댓글 수: 2

Thanks for the answer, but I'm after class precedence, not subclass hierarchy.
Well, I should have taken 6 minutes instead of 5, and read completely the question!

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Construct and Work with Object Arrays에 대해 자세히 알아보기

제품

태그

질문:

2013년 10월 4일

댓글:

2013년 10월 8일

Community Treasure Hunt

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

Start Hunting!

Translated by