Classdef: Difference between revisions

From Octave
Jump to navigation Jump to search
(→‎Not Supported: Added another workaround for function handles to fcns in packages)
(53 intermediate revisions by 10 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.


{| 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.
|}


* '''build-in class as superclass'''
==== Methods ====
<source lang="octave">
classdef nonsense < uint32


end
Classdef methods are supported but not all attributes are fully implemented.
</source>


{| class="wikitable"
|-
! style="text-align:left;"| Attribute
! Support
! Notes
|-
|Abstract
|Partial
|See bug report {{bug|51377}}
|-
|Access
|Yes
|
|-
|Hidden
|Yes
|
|-
|Sealed
|Yes
|
|-
|Static
|Yes
|
|}


* '''[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].'''
=== Features that are not implemented ===


Example:
==== [https://www.mathworks.com/help/matlab/enumeration-classes.html enumeration] ====
<source lang="octave">
classdef MyClass < handle
end


c = MyClass();
* {{bug|44582}} Parse the enumeration section of a classdef definition but nothing is done with it.
cc = [c, c];  % won't work
</source>


For now you can use a cell-array of objects instead:
==== [https://www.mathworks.com/help/matlab/matlab_oop/learning-to-use-events-and-listeners.html events and listeners] ====
<source lang="octave">
cc = {c, c};  % ok
</source>


* {{bug|56194}} Parse the events section of a classdef definition but nothing is done with it.


* '''[http://www.mathworks.com/help/matlab/matlab_oop/mutable-and-immutable-properties.html Immutable property] set access.'''
==== [https://www.mathworks.com/help/matlab/matlab_oop/property-validator-functions.html Property Validation Functions] ====
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.
=== Open Bug Reports for Other Issues ===


==== Issues with basic classdef functionality ====


* '''Function handles to package methods and static class methods.'''
* {{bug|51659}} Calling 'methods' on self causes syntax error
For example if we have <code>+mypackage/myfunc.m</code>, creating a function handle as <code>fh = @mypackage.myfunc</code> won't work.
* {{bug|52096}} meta.class.fromName throws error when class name not found.
As a workaround, we can create an indirection using an anonymous function <code>fh = @(varargin) mypackage.myfunc(varargin{:})</code>.
* {{bug|55983}} 'x(ix) = []' deletion syntax does not work for objects
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>.
* {{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|61676}} Assigning classdef objects to other types does not call converter methods


A fuller example is also given below:
==== Classdef and +package directories ====
<source lang="octave">
classdef method_function_handle_test


%  properties
* [https://savannah.gnu.org/bugs/?54941 54941] interpreter cannot find methods in files of classdefs in packages
%  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
==== Arrays of classdef objects ====
 
  methods (Hidden, Access = protected)
    function foo (self)
      disp ('hello!');
    end
  end


end
* {{bug|44665}} error in concatenation of classdef objects
</source>
* {{bug|53906}} Cannot make an object array with square brackets
Then running:
* {{bug|47755}} Access to object arrays
<source lang="text">
* {{bug|47241}} classdef: assigning property of handle object in object array constructs new object
>> 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>


==== Debugger (fixes for these are in progress) ====


* '''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.'''
* {{bug|46451}} <s>unable to set breakpoints within classdef classes</s> - <em> Patch closed </em>
For example, the following code gives a syntax/parse error:
* {{bug|45404}} <s>Breakpoints cannot be set in classdef methods or +package function files</s> - <em>Report closed</em>
<source lang="octave">
* {{bug|65610}} unable to set breakpoints within set or get functions of classdef classes - <em> Patch applied, ready for test </em>
classdef MyClass
    methods
        function obj = MyClass()
            myfunc()
        end
    end
end


function myfunc()
==== Lower-priority issues ====
    disp('myfunc')
end
</source>


* '''debugging in classdef methods (and +package directory functions)'''
* {{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
* {{bug|62432}} classdef object display of boolean matrix property fails with error message


Breakpoints cannot currently be set in classdef methods from the gui, but only from the command line:
==== Documentation ====
<source lang="octave">
dbstop @aclass\amethod
</source>


=== Supported ===
* {{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


* methods
=== Classdef examples in Octave ===
** static
** private


* properties
* [https://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/miscellaneous/inputParser.m inputParser.m]
** SetAccess (public/private/protected)
* [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]


==== Classdef examples in the wild ====
[[Category:Development]]
 
* http://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/general/inputParser.m
* https://github.com/markuman/go-redis
* https://github.com/PetrKryslUCSD/FinEALE

Revision as of 19:30, 24 September 2024

Supported Features

Properties

Classdef properties are supported but not all attributes are implemented.

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

Classdef methods are supported but not all attributes are fully implemented.

Attribute Support Notes
Abstract Partial See bug report #51377
Access Yes
Hidden Yes
Sealed Yes
Static Yes

Features that are not implemented

enumeration

  • #44582 Parse the enumeration section of a classdef definition but nothing is done with it.

events and listeners

  • #56194 Parse the events section of a classdef definition but nothing is done with it.

Property Validation Functions

Open Bug Reports for Other Issues

Issues with basic classdef functionality

  • #51659 Calling 'methods' on self causes syntax error
  • #52096 meta.class.fromName throws error when class name not found.
  • #55983 'x(ix) = []' deletion syntax does not work for objects
  • #55976 cat, repmat, and reshape don't work for classdef objects
  • #55961 properties function does not preserve order - Patch submitted, awaiting review
  • #52582 using static method to initialize property value fails
  • #45833 support load/save of classdef objects
  • #61676 Assigning classdef objects to other types does not call converter methods

Classdef and +package directories

  • 54941 interpreter cannot find methods in files of classdefs in packages

Arrays of classdef objects

  • #44665 error in concatenation of classdef objects
  • #53906 Cannot make an object array with square brackets
  • #47755 Access to object arrays
  • #47241 classdef: assigning property of handle object in object array constructs new object

Debugger (fixes for these are in progress)

  • #46451 unable to set breakpoints within classdef classes - Patch closed
  • #45404 Breakpoints cannot be set in classdef methods or +package function files - Report closed
  • #65610 unable to set breakpoints within set or get functions of classdef classes - Patch applied, ready for test

Lower-priority issues

  • #55488 Invalid use of colon char as classdef function's argument when subsref is overwritten
  • #54966 Error when assigning array to an object implementing subsasgn() subscripted using "{}"
  • #54028 copy of non-handle class instance is not deep
  • #53811 cellfun does not find overloaded function with function name argument
  • #52989 classdef: missing error messages on multiply defined properties
  • #52582 Dependent constant properties in classdef errors: no such file
  • #52123 Indirect memory leak in cdef_manager::initialize ()
  • #51285 max_recursion_depth error in classdef constructor
  • #50395 subclassing a class that is also defined as a variable fails
  • #50011 failure to report error on conflicting methods for classdef
  • #49379 classdef constructor: .argn. loses first argument, inputname(n) returns inputname(n+1)
  • #55810 sizeof() and whos() returns 0 bytes for classdef objects
  • #45893 classdef properties are not reloaded when file is updated
  • #44643 classdef handle object can go into an recursive loop with isequal(obj1,obj2) if both are self-referential
  • #55755 mxGetProperty does not work with properties marked as Dependent
  • #55767 classdef property should not be the same as classdef name (at least for Matlab compatibility)
  • #44035 unable to subclass built-in types
  • #62432 classdef object display of boolean matrix property fails with error message

Documentation

  • #50729 Improve OOP documentation
  • #47908 Octave:classdef-to-struct not documented in warning_ids.m
  • #44590 More documentation for the current status of classdef implementation

Classdef examples in Octave