Classdef: Difference between revisions
Jump to navigation
Jump to search
(→Classdef examples in the wild: Added FinEALE which uses classdef extensively) |
(→not supported: added fuller example from bug report) |
||
Line 41: | Line 41: | ||
For example if we have <code>+mypackage/myfunc.m</code>, creating a function handle as <code>fh = @mypackage.myfunc</code> won't work. | For example if we have <code>+mypackage/myfunc.m</code>, creating a function handle as <code>fh = @mypackage.myfunc</code> won't work. | ||
As a workaround, we can create an indirection using an anonymous function <code>fh = @(varargin) mypackage.myfunc(varargin{:})</code>. | As a workaround, we can create an indirection using an anonymous function <code>fh = @(varargin) mypackage.myfunc(varargin{:})</code>. | ||
Similarly for static class methods where <code>fh = @MyClass.myfunc</code> isn't yet supported. | Similarly for static class methods where <code>fh = @MyClass.myfunc</code> isn't yet supported. | ||
A fuller example is also given below: | |||
<source lang="octave"> | |||
classdef method_function_handle_test | |||
% properties | |||
% | |||
% | |||
% end | |||
properties (Hidden, SetAccess = protected) | |||
hfoo = [];% handle to function | |||
end | |||
methods | |||
function self = method_function_handle_test () | |||
self.hfoo = @foo; | |||
end | |||
function bar (self) | |||
self.hfoo (self); | |||
end | |||
end | |||
methods (Hidden, Access = protected) | |||
function foo (self) | |||
disp ('hello!'); | |||
end | |||
end | |||
end | |||
</source> | |||
Then running: | |||
<source lang="text"> | |||
>> x = method_function_handle_test | |||
error: @foo: no function and no method found | |||
error: called from | |||
method_function_handle_test at line 17 column 17 | |||
stopped in <****>/scratch/mfiles/octave_tests/method_function_handle_test.m at line 17 | |||
17: self.hfoo = @foo; | |||
</source> | |||
* Defining [http://www.mathworks.com/help/matlab/matlab_oop/specifying-methods-and-functions.html#br2la89 local functions] in the same classdef-file is not working. For example, the following code gives a syntax/parse error: | * Defining [http://www.mathworks.com/help/matlab/matlab_oop/specifying-methods-and-functions.html#br2la89 local functions] in the same classdef-file is not working. For example, the following code gives a syntax/parse error: |
Revision as of 10:10, 25 June 2015
This page is a stub. We should begin documenting what classdef is implemented and what is not.
not supported
- enumeration
- build-in class as superclass
classdef nonsense < uint32
- concatenating objects into array of objects. Example:
classdef MyClass < handle
end
c = MyClass();
cc = [c, c]; % won't work
For now you can use a cell-array of objects instead:
cc = {c, c}; % ok
- Immutable property set access. Example:
classdef MyClass < handle
properties (SetAccess = immutable)
x
end
methods
function obj = MyClass()
x = rand();
end
end
end
Use "private" properties as workaround.
- Function handles to package methods and static class methods.
For example if we have +mypackage/myfunc.m
, creating a function handle as fh = @mypackage.myfunc
won't work.
As a workaround, we can create an indirection using an anonymous function fh = @(varargin) mypackage.myfunc(varargin{:})
.
Similarly for static class methods where fh = @MyClass.myfunc
isn't yet supported.
A fuller example is also given below:
classdef method_function_handle_test
% properties
%
%
% end
properties (Hidden, SetAccess = protected)
hfoo = [];% handle to function
end
methods
function self = method_function_handle_test ()
self.hfoo = @foo;
end
function bar (self)
self.hfoo (self);
end
end
methods (Hidden, Access = protected)
function foo (self)
disp ('hello!');
end
end
end
Then running:
>> x = method_function_handle_test
error: @foo: no function and no method found
error: called from
method_function_handle_test at line 17 column 17
stopped in <****>/scratch/mfiles/octave_tests/method_function_handle_test.m at line 17
17: self.hfoo = @foo;
- Defining local functions in the same classdef-file is not working. For example, the following code gives a syntax/parse error:
classdef MyClass
methods
function obj = MyClass()
myfunc()
end
end
end
function myfunc()
disp('myfunc')
end
- debugging in classdef methods (and +package directory functions)
Breakpoints cannot currently be set in classdef methods (or at least they are ignored). They also can't be set in functions in +package directories (which is a related issue).
supported
- methods
- static
- private