Editing Classdef
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
This page is a stub. We should begin documenting what classdef is implemented and what is not. | |||
=== | === Not Supported === | ||
* '''enumeration''' | |||
{| | See {{bug|44582}} and help implementing it. | ||
* '''build-in class as superclass''' | |||
<source lang="octave"> | |||
classdef nonsense < uint32 | |||
end | |||
</source> | |||
See {{bug|44035}} | |||
* '''[http://www.mathworks.com/help/matlab/matlab_oop/redefining-concatenation-for-your-class.html concatenating objects] into [http://www.mathworks.com/help/matlab/matlab_oop/initialize-object-arrays.html array of objects].''' | |||
Example: | |||
<source lang="octave"> | |||
classdef MyClass < handle | |||
end | |||
= | c = MyClass(); | ||
cc = [c, c]; % won't work | |||
</source> | |||
For now you can use a cell-array of objects instead: | |||
<source lang="octave"> | |||
cc = {c, c}; % ok | |||
</source> | |||
Also see {{bug|44665}} | |||
=== | * '''[http://www.mathworks.com/help/matlab/matlab_oop/mutable-and-immutable-properties.html Immutable property] set access.''' | ||
Example: | |||
<source lang="octave"> | |||
classdef MyClass < handle | |||
properties (SetAccess = immutable) | |||
x | |||
end | |||
methods | |||
function obj = MyClass() | |||
x = rand(); | |||
end | |||
end | |||
end | |||
</source> | |||
Use "private" properties as workaround. | |||
==== | * '''Function handles to package methods and static class methods.''' | ||
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>. | |||
Similarly for static class methods where <code>fh = @MyClass.myfunc</code> isn't yet supported. Another workaround for package function handles is to use <code>str2func</code>, e.g. <code>fh = str2func ("mypackage.myfunc")</code>. | |||
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> | |||
See {{bug|45351}} | |||
* '''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: | |||
<source lang="octave"> | |||
classdef MyClass | |||
methods | |||
function obj = MyClass() | |||
myfunc() | |||
end | |||
end | |||
end | |||
function myfunc() | |||
disp('myfunc') | |||
end | |||
</source> | |||
See {{bug|41723}}. | |||
* '''debugging in classdef methods (and +package directory functions)''' | |||
Breakpoints cannot currently be set in classdef methods from the gui, but only from the command line: | |||
<source lang="octave"> | |||
dbstop @aclass\amethod | |||
</source> | |||
See {{bug|45404}} | |||
* '''Saving/reading classdef objects to/from (.mat) file''' | |||
=== Supported === | |||
* methods | |||
** static | |||
** private | |||
* properties | |||
** SetAccess (public/private/protected) | |||
=== Open Bug Reports === | |||
Issues with basic classdef functionality | |||
* [https://savannah.gnu.org/bugs/?51659 51659] Calling 'methods' on self causes syntax error | |||
* [https://savannah.gnu.org/bugs/?48682 48682] print_usage fails within classdef block | |||
* [https://savannah.gnu.org/bugs/?49434 49434] which returns "built-in function" for classdef m-file | |||
* [https://savannah.gnu.org/bugs/?48041 48041] classdef: `help myclass` messes up `help @myclass/method` | |||
* [https://savannah.gnu.org/bugs/?43047 43047] help() does not see classdef files | |||
* [https://savannah.gnu.org/bugs/?42620 42620] exist() does not use "class" argument | |||
* [https://savannah.gnu.org/bugs/?53874 53874] doc_cache_create doesnt handle classdef documentation | |||
* [https://savannah.gnu.org/bugs/?52096 52096] meta.class.fromName throws error when class name not found. | |||
* [https://savannah.gnu.org/bugs/?51377 51377] Parse error for abstract methods | |||
* [https://savannah.gnu.org/bugs/?44665 44665] error in concatenation of classdef objects | |||
* [https://savannah.gnu.org/bugs/?44582 44582] classdef: missing support for enumeration | |||
* [https://savannah.gnu.org/bugs/?48693 48693] classdef subsref method is not called with correct nargout value | |||
Classdef and +package directories | |||
* [https://savannah.gnu.org/bugs/?54941 54941] interpreter cannot find methods in files of classdefs in packages | * [https://savannah.gnu.org/bugs/?54941 54941] interpreter cannot find methods in files of classdefs in packages | ||
* [https://savannah.gnu.org/bugs/?54273 54273] Can't access properties of class in package in function defined in class | |||
Arrays of classdef objects | |||
* | * [https://savannah.gnu.org/bugs/?53906 53906] Cannot make an object array with square brackets | ||
* [https://savannah.gnu.org/bugs/?47755 47755] Access to object arrays | |||
* | * [https://savannah.gnu.org/bugs/?47241 47241] classdef: assigning property of handle object in object array constructs new object | ||
* | |||
I/O issues | |||
* | * [https://savannah.gnu.org/bugs/?55497 55497] No or wrong default file name when saving a classdef file | ||
* | * [https://savannah.gnu.org/bugs/?45833 45833] support load/save of classdef objects | ||
Debugger | |||
* [https://savannah.gnu.org/bugs/?46451 46451] unable to set breakpoints within classdef classes | |||
* [https://savannah.gnu.org/bugs/?45404 45404] Breakpoints cannot be set in classdef methods or +package function files | |||
Lower-priority issues | |||
* [https://savannah.gnu.org/bugs/?55488 55488] Invalid use of colon char as classdef function's argument when subsref is overwritten | |||
* [https://savannah.gnu.org/bugs/?55487 55487] ismethod of custom classdefs always returning false | |||
* [https://savannah.gnu.org/bugs/?54966 54966] Error when assigning array to an object implementing subsasgn() subscripted using "{}" | |||
* [https://savannah.gnu.org/bugs/?54783 54783] subsasgn call when the subscripted expression contains the end keyword | |||
* [https://savannah.gnu.org/bugs/?54028 54028] copy of non-handle class instance is not deep | |||
* [https://savannah.gnu.org/bugs/?53811 53811] cellfun does not find overloaded function with function name argument | |||
* [https://savannah.gnu.org/bugs/?52989 52989] classdef: missing error messages on multiply defined properties | |||
* [https://savannah.gnu.org/bugs/?52614 52614] setting properties of classdef object during construction with inheritance | |||
* [https://savannah.gnu.org/bugs/?52582 52582] Dependent constant properties in classdef errors: no such file | |||
* [https://savannah.gnu.org/bugs/?52123 52123] Indirect memory leak in cdef_manager::initialize () | |||
* [https://savannah.gnu.org/bugs/?51285 51285] max_recursion_depth error in classdef constructor | |||
* [https://savannah.gnu.org/bugs/?50395 50395] subclassing a class that is also defined as a variable fails | |||
* [https://savannah.gnu.org/bugs/?50011 50011] failure to report error on conflicting methods for classdef | |||
* [https://savannah.gnu.org/bugs/?49379 49379] classdef constructor: .argn. loses first argument, inputname(n) returns inputname(n+1) | |||
* [https://savannah.gnu.org/bugs/?46652 46652] whos bytes property not right for classdef classes | |||
* [https://savannah.gnu.org/bugs/?45893 45893] classdef properties are not reloaded when file is updated | |||
* [https://savannah.gnu.org/bugs/?44934 44934] classdef parser prints extra newline when failing to parse bad classdef file | |||
* [https://savannah.gnu.org/bugs/?44643 44643] classdef handle object can go into an recursive loop with isequal(obj1,obj2) if both are self-referential | |||
* [https://savannah.gnu.org/bugs/?44035 44035] classdef is unable to to subclass double | |||
Documentation | |||
* [https://savannah.gnu.org/bugs/?50729 50729] Improve OOP documentation | |||
* [https://savannah.gnu.org/bugs/?47908 47908] Octave:classdef-to-struct not documented in warning_ids.m | |||
* [https://savannah.gnu.org/bugs/?44590 44590] More documentation for the current status of classdef implementation | |||
=== Classdef examples in the wild === | |||
* http://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/general/inputParser.m | |||
* http://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/%2Bcontainers/Map.m | |||
* https://github.com/markuman/go-redis | |||
* https://github.com/PetrKryslUCSD/FinEALE |