Calling a class's static method from its metadata

조회 수: 4 (최근 30일)
Thomas Atkinson
Thomas Atkinson 2020년 3월 12일
편집: Matt J 2020년 3월 12일
I am looking to create a number of classes which all subclass a superclass, AnalysisFunction in this case, which defines one abstract static method, results = apply(ClassWithData).
I want a controller class to be able to call apply(classWithData) on all classes which subclass AnalysisFunction. My initial plan is to create a namespace to house all the subclasses I want to be called then in the controller get the namespace's metadata object, loop through the present classes, check if each subclasses AnalysisFunction and if it does, call apply(classWithData) on the class.
To do this, I need to be able to evaluate a method against a class from its metadata. A simple, though in my opinion ugly, way of doing this is to use eval with the class's name (from the metadata object) and .apply(classWithData) concatenated as a string.
Is there a way to avoid the use of eval, or indeed a better way entirely from what I am proposing to achieve the calling of such an abstract static function on all subclasses? Thanks in advance!
  댓글 수: 3
Thomas Atkinson
Thomas Atkinson 2020년 3월 12일
Ah, sorry, probably wasn't so clear. classWithData is another class I've made such that it behaves like a struct (SetAccess = private) so I can store data centrally and have each analysis function fetch what it needs.
Thomas Atkinson
Thomas Atkinson 2020년 3월 12일
Here's a rubbish UML of what I'm trying to get. classWithData is an instance of DataStore.

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

답변 (1개)

Matt J
Matt J 2020년 3월 12일
편집: Matt J 2020년 3월 12일
or indeed a better way entirely from what I am proposing to achieve the calling of such an abstract static function on all subclasses?
If you have an object of the sub-class present, you can use it to call the Static method of the sub-class.
if isa(obj,'AnalysisFunction')
obj.apply(classWithData);
end
  댓글 수: 1
Matt J
Matt J 2020년 3월 12일
편집: Matt J 2020년 3월 12일
Is there a way to avoid the use of eval
Aside from the above, you could use feval instead.
feval(str2func(class(obj)+".apply"), classWithData)

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

카테고리

Help CenterFile Exchange에서 Data Type Identification에 대해 자세히 알아보기

제품


릴리스

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by