Is it possible to dynamically add methods to an object, or to build a generic method that "catches attempts to access nonexistent methods"?
25 次查看(过去 30 天)
显示 更早的评论
Dear all,
I have seen similar questions asked serveral times, e.g. here @mathworks and here @stackoverflow, but it never really applies to my context.
Hence my question: is it possible to do one of the following operations (?)
- Add methods to an object dynamically during instantiation (from the constructor).
- "Catch attempts to access a nonexistent method" by overloading some method (the way we overload subsasgn()/subsref() for managing indexing).
- Subclass a given class dynamically, during instantiation (from the constructor). [I am a little less interested in this one, because we cannot subclass all built-ins].
The reason is the following. I built a class that allows users to "extend" existing objects passed to the constructor. To illustrate
>> a = 2 ; % double
>> b = MyClass( a ) ; % double extended
Now I would like to "delegate" whatever method call to double if it is not implemented in MyClass. I can easily manage two situations, that I illustrate with a sin() function/method:
- I implement sin() in MyClass, so any sin(b) or b.sin() calls MyClass.sin() which can manage to apply sin() to the double 2. This is not a practicable solution in my case, because I cannot implement all possible methods for all possible "classes-to-extend".
- Without implementing MyClass.sin(), I can catch such calls with subsref() and manage the rest. This is again not a working solution, because sin(b) is not caught by subsref(). It seems actually that MATLAB tests whether MyClass/b has a sin() method when we evaluate sin(b) and returns an error if not, instead of trying the call and failing.. (?)
So is there a way to catch sin(b) with a subsref()-like method/overload, or a way to have MATLAB calling a specific method of MyClass/b when calls to nonexistent methods (or tests of existence) are attempted?
Thank you and best regards,
Cedric
0 个评论
采纳的回答
更多回答(2 个)
Daniel Shub
2013-1-17
Probably not optimal, but you might be able to dynamically overload what classname returns, which in turn may affect what is called. I tried this in this answer:
There is also an answer by Malcolm that might be helpful.
3 个评论
Paul Wintz
2021-10-4
You can make
x = MyClass(2);
cos(x);
work by adding the following method to MyClass:
classdef MyClass
methods
function y = cos(x)
y = builtin('cos', x);
end
end
end
Darik
2013-1-17
It seems to work (in 2012b, at least) if you subclass dynamicprops
%
classdef MyClass < dynamicprops
properties
Data
end
methods
function self = MyClass (x)
self = self@dynamicprops;
self.Data = x;
end
function varargout = subsref (self, S)
try
[varargout{1:nargout}] = builtin('subsref', self, S);
catch
[varargout{1:nargout}] = feval(S(1).subs, self.Data);
end
end
end
end
>> a = MyClass(0);
>> a.Data %normal property access
ans = 0
>> a.my_method() %normal method call
ans = 100
>> a.cos() %overridden method call
ans = 1
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Methods 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!