|
|
(37 intermediate revisions by 5 users not shown) |
Line 1: |
Line 1: |
| This page is a stub. We should begin documenting what classdef is implemented and what is not.
| | === Supported Features === |
|
| |
|
| === Not Supported === | | ==== Properties ==== |
|
| |
|
| * '''enumeration'''
| | Classdef properties are supported but not all attributes are implemented. |
|
| |
|
| See {{bug|44582}} and help implementing it.
| | {| class="wikitable" |
| | |- |
| | ! style="text-align:left;"| Attribute |
| | ! Support |
| | ! Notes |
| | |- |
| | |AbortSet |
| | |No |
| | |Property does not exist. |
| | |- |
| | |Abstract |
| | |Yes |
| | | |
| | |- |
| | |Access |
| | |Partial |
| | | |
| | |- |
| | |Constant |
| | |Yes |
| | | |
| | |- |
| | |Dependent |
| | |Partial |
| | | |
| | |- |
| | |GetAccess |
| | |Partial |
| | | |
| | |- |
| | |GetObservable |
| | |No |
| | |Property exists but is not used. Requires events and listeners to be implemented in order to work properly. |
| | |- |
| | |Hidden |
| | |Yes |
| | | |
| | |- |
| | |NonCopyable |
| | |No |
| | |Property does not exist. |
| | |- |
| | |SetAccess |
| | |Partial |
| | | |
| | |- |
| | |SetObservable |
| | |No |
| | |Property exists but is not used. Requires events and listeners to be implemented in order to work properly. |
| | |- |
| | |Transient |
| | |No |
| | |Property exists but is not used. |
| | |} |
|
| |
|
| | ==== Methods ==== |
|
| |
|
| * '''build-in class as superclass'''
| | Classdef methods are supported but not all attributes are fully implemented. |
| <source lang="octave">
| |
| classdef nonsense < uint32
| |
|
| |
|
| end
| | {| class="wikitable" |
| </source>
| | |- |
| | ! style="text-align:left;"| Attribute |
| | ! Support |
| | ! Notes |
| | |- |
| | |Abstract |
| | |Partial |
| | |See bug report {{bug|51377}} |
| | |- |
| | |Access |
| | |Yes |
| | | |
| | |- |
| | |Hidden |
| | |Yes |
| | | |
| | |- |
| | |Sealed |
| | |Yes |
| | | |
| | |- |
| | |Static |
| | |Yes |
| | | |
| | |} |
|
| |
|
| See {{bug|44035}}
| | === Features that are not implemented === |
|
| |
|
| * '''[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].'''
| | ==== [https://www.mathworks.com/help/matlab/enumeration-classes.html enumeration] ==== |
|
| |
|
| Example:
| | * {{bug|44582}} Parse the enumeration section of a classdef definition but nothing is done with it. |
| <source lang="octave">
| |
| classdef MyClass < handle | |
| end
| |
|
| |
|
| c = MyClass();
| | ==== [https://www.mathworks.com/help/matlab/matlab_oop/learning-to-use-events-and-listeners.html events and listeners] ==== |
| cc = [c, c]; % won't work
| |
| </source>
| |
|
| |
|
| For now you can use a cell-array of objects instead:
| | * {{bug|56194}} Parse the events section of a classdef definition but nothing is done with it. |
| <source lang="octave">
| |
| cc = {c, c}; % ok
| |
| </source>
| |
|
| |
|
| Also see {{bug|44665}}
| | ==== [https://www.mathworks.com/help/matlab/matlab_oop/property-validator-functions.html Property Validation Functions] ==== |
|
| |
|
| * '''[http://www.mathworks.com/help/matlab/matlab_oop/mutable-and-immutable-properties.html Immutable property] set access.'''
| | === Open Bug Reports for Other Issues === |
| 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.
| | ==== Issues with basic classdef functionality ==== |
|
| |
|
| | * {{bug|51659}} Calling 'methods' on self causes syntax error |
| | * {{bug|48682}} print_usage fails within classdef block |
| | * {{bug|48041}} classdef: `help myclass` messes up `help @myclass/method` |
| | * {{bug|52096}} meta.class.fromName throws error when class name not found. |
| | * {{bug|48693}} classdef subsref method is not called with correct nargout value - <em>Patch applied, Ready for Test</em> |
| | * {{bug|56006}} Object indexing: obj(1).property(end+1:n) - end is interpreted wrong |
| | * {{bug|55983}} 'x(ix) = []' deletion syntax does not work for objects |
| | * {{bug|55976}} cat, repmat, and reshape don't work for classdef objects |
| | * {{bug|55961}} properties function does not preserve order - <em>Patch submitted, awaiting review</em> |
| | * {{bug|52582}} using static method to initialize property value fails |
| | * {{bug|45833}} support load/save of classdef objects |
| | * {{bug|60729}} print_usage within classdef constructor breaks subsequent calls to the class |
| | * {{bug|61676}} Assigning classdef objects to other types does not call converter methods |
| | * {{bug|63841}} nargout is always 1 for classdef methods |
|
| |
|
| * '''Function handles to package methods and static class methods.'''
| | ==== Classdef and +package directories ==== |
| 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 ===
| |
| | |
| Function handles and classdef methods
| |
| | |
| * [https://savannah.gnu.org/bugs/?48802 48802] function overload resolution on function handles fails on classdef methods defined in class body
| |
| * [https://savannah.gnu.org/bugs/?46659 46659] classdef: cannot create handles to functions in +package
| |
| * [https://savannah.gnu.org/bugs/?45351 45351] function handles to classdef methods not supported
| |
| * [https://savannah.gnu.org/bugs/?51709 51709] Creating function handle to static methods
| |
| * [https://savannah.gnu.org/bugs/?47680 47680] classdef @ operator to overrided superclass methods
| |
| | |
| Issues with basic classdef functionality
| |
| | |
| * [https://savannah.gnu.org/bugs/?42510 42510] methods() does not return functions defined in classdef file
| |
| * [https://savannah.gnu.org/bugs/?51659 51659] Calling 'methods' on self causes syntax error
| |
| * [https://savannah.gnu.org/bugs/?53614 53614] classdef properties() function not implemented
| |
| * [https://savannah.gnu.org/bugs/?46387 46387] Display class properties
| |
| * [https://savannah.gnu.org/bugs/?48682 48682] print_usage fails within classdef block
| |
| * [https://savannah.gnu.org/bugs/?55223 55223] can't subsasgn with 2-level index (curly braces + parentheses) with classdef handle
| |
| * [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/?45457 45457] Incorrect behavior of constant classdef properties referencing other constant properties in the same block
| |
| * [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/?44036 44036] interpreter does not recognize classdef (syntax error)
| |
| * [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 | | ==== Arrays of classdef objects ==== |
|
| |
|
| * [https://savannah.gnu.org/bugs/?53906 53906] Cannot make an object array with square brackets | | * {{bug|44665}} error in concatenation of classdef objects |
| * [https://savannah.gnu.org/bugs/?47755 47755] Access to object arrays | | * {{bug|53906}} Cannot make an object array with square brackets |
| * [https://savannah.gnu.org/bugs/?47241 47241] classdef: assigning property of handle object in object array constructs new object | | * {{bug|47755}} Access to object arrays |
| | * {{bug|47241}} classdef: assigning property of handle object in object array constructs new object |
|
| |
|
| I/O issues
| | ==== Debugger (fixes for these are in progress) ==== |
|
| |
|
| * [https://savannah.gnu.org/bugs/?55497 55497] No or wrong default file name when saving a classdef file | | * {{bug|46451}} unable to set breakpoints within classdef classes - <em> Patch applied, Ready for Test </em> |
| * [https://savannah.gnu.org/bugs/?45833 45833] support load/save of classdef objects | | * {{bug|45404}} <s>Breakpoints cannot be set in classdef methods or +package function files</s> - <em>Report closed</em> |
| Debugger
| |
|
| |
|
| * [https://savannah.gnu.org/bugs/?46451 46451] unable to set breakpoints within classdef classes
| | ==== Lower-priority issues ==== |
| * [https://savannah.gnu.org/bugs/?45404 45404] Breakpoints cannot be set in classdef methods or +package function files
| |
|
| |
|
| Lower-priority issues
| | * {{bug|55488}} Invalid use of colon char as classdef function's argument when subsref is overwritten |
| | * {{bug|54966}} Error when assigning array to an object implementing subsasgn() subscripted using "{}" |
| | * {{bug|54028}} copy of non-handle class instance is not deep |
| | * {{bug|53811}} cellfun does not find overloaded function with function name argument |
| | * {{bug|52989}} classdef: missing error messages on multiply defined properties |
| | * {{bug|52582}} Dependent constant properties in classdef errors: no such file |
| | * {{bug|52123}} Indirect memory leak in cdef_manager::initialize () |
| | * {{bug|51285}} max_recursion_depth error in classdef constructor |
| | * {{bug|50395}} subclassing a class that is also defined as a variable fails |
| | * {{bug|50011}} failure to report error on conflicting methods for classdef |
| | * {{bug|49379}} classdef constructor: .argn. loses first argument, inputname(n) returns inputname(n+1) |
| | * {{bug|55810}} sizeof() and whos() returns 0 bytes for classdef objects |
| | * {{bug|45893}} classdef properties are not reloaded when file is updated |
| | * {{bug|44643}} classdef handle object can go into an recursive loop with isequal(obj1,obj2) if both are self-referential |
| | * {{bug|55755}} mxGetProperty does not work with properties marked as Dependent |
| | * {{bug|55767}} classdef property should not be the same as classdef name (at least for Matlab compatibility) |
| | * {{bug|44035}} unable to subclass built-in types |
|
| |
|
| * [https://savannah.gnu.org/bugs/?55488 55488] Invalid use of colon char as classdef function's argument when subsref is overwritten
| | ==== Documentation ==== |
| * [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
| | * {{bug|50729}} Improve OOP documentation |
| | * {{bug|47908}} Octave:classdef-to-struct not documented in warning_ids.m |
| | * {{bug|44590}} More documentation for the current status of classdef implementation |
|
| |
|
| * [https://savannah.gnu.org/bugs/?50729 50729] Improve OOP documentation
| | === Classdef examples in Octave === |
| * [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 ===
| | * [https://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/miscellaneous/inputParser.m inputParser.m] |
| | * [https://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/web/weboptions.m weboptions.m] |
| | * [https://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/%2Bcontainers/Map.m +containers/Map.m] |
|
| |
|
| * http://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/general/inputParser.m
| | [[Category:Development]] |
| * http://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/%2Bcontainers/Map.m
| |
| * https://github.com/markuman/go-redis
| |
| * https://github.com/PetrKryslUCSD/FinEALE
| |