Classdef: Difference between revisions

Jump to navigation Jump to search
3,673 bytes added ,  18 January 2020
→‎Features that are not implemented: Property Validation Functions and links
(→‎Not Supported: add link to bug report)
(→‎Features that are not implemented: Property Validation Functions and links)
(27 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:
Octave should be able to parse the enumeration section of a classdef definition but nothing is done with it.  Progress on this feature is tracked in bug report {{bug|44582}}.
<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:
Octave should be able to parse the events section of a classdef definition but nothing is done with it.  Progress on this feature is tracked in bug report {{bug|56194}}.
<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 ====


* [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/?48693 48693] classdef subsref method is not called with correct nargout value
* [https://savannah.gnu.org/bugs/?56006 56006] Object indexing: obj(1).property(end+1:n) - end is interpreted wrong
* [https://savannah.gnu.org/bugs/?55983 55983] 'x(ix) = []' deletion syntax does not work for objects
* [https://savannah.gnu.org/bugs/?55976 55976] cat, repmat, and reshape don't work for classdef objects
* [https://savannah.gnu.org/bugs/?55961 55961] properties function does not preserve order
* [https://savannah.gnu.org/bugs/?55768 55768] display of classdef object should not show private or protected properties
* [https://savannah.gnu.org/bugs/?55766 55766] properties function should not return Hidden properties
* [https://savannah.gnu.org/bugs/?55746 55746] interpreter fails to instantiate classdef with classdef properties
* [https://savannah.gnu.org/bugs/?52582 52582] using static method to initialize property value fails
* [https://savannah.gnu.org/bugs/?45833 45833] support load/save of classdef objects


* '''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:
* [https://savannah.gnu.org/bugs/?54941 54941] interpreter cannot find methods in files of classdefs in packages
<source lang="octave">
classdef method_function_handle_test


%  properties
==== Arrays of classdef objects ====
%  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
* [https://savannah.gnu.org/bugs/?44665 44665] error in concatenation of classdef objects
 
* [https://savannah.gnu.org/bugs/?53906 53906] Cannot make an object array with square brackets
  methods (Hidden, Access = protected)
* [https://savannah.gnu.org/bugs/?47755 47755] Access to object arrays
    function foo (self)
* [https://savannah.gnu.org/bugs/?47241 47241] classdef: assigning property of handle object in object array constructs new object
      disp ('hello!');
    end
  end


end
==== Debugger (fixes for these are in progress) ====
</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>


* [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


* '''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.'''
==== Lower-priority issues ====
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()
* [https://savannah.gnu.org/bugs/?55488 55488] Invalid use of colon char as classdef function's argument when subsref is overwritten
    disp('myfunc')
* [https://savannah.gnu.org/bugs/?54966 54966] Error when assigning array to an object implementing subsasgn() subscripted using "{}"
end
* [https://savannah.gnu.org/bugs/?54028 54028] copy of non-handle class instance is not deep
</source>
* [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
* <strike>[https://savannah.gnu.org/bugs/?52614 52614] setting properties of classdef object during construction with inheritance</strike>
* [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/?55810 55810] sizeof() and whos() returns 0 bytes for classdef objects
* [https://savannah.gnu.org/bugs/?45893 45893] classdef properties are not reloaded when file is updated
* [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/?55755 55755] mxGetProperty does not work with properties marked as Dependent
* [https://savannah.gnu.org/bugs/?55767 55767] classdef property should not be the same as classdef name (at least for Matlab compatibility)
* [https://savannah.gnu.org/bugs/?44035 44035] unable to subclass built-in types


See {{bug|41723}}.
==== Documentation ====


* '''debugging in classdef methods (and +package directory functions)'''
* [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


Breakpoints cannot currently be set in classdef methods from the gui, but only from the command line:
=== Classdef examples in the wild ===
<source lang="octave">
dbstop @aclass\amethod
</source>
 
* '''Saving/reading classdef objects to/from (.mat) file'''
 
=== Supported ===
 
* methods
** static
** private
 
* properties
** SetAccess (public/private/protected)
 
==== 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/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/markuman/go-redis
* https://github.com/PetrKryslUCSD/FinEALE
* https://github.com/PetrKryslUCSD/FinEALE

Navigation menu