Difference between revisions of "Classdef"

From Octave
Jump to navigation Jump to search
m (→‎Lower-priority issues: Update bug #52614.)
 
(22 intermediate revisions by 2 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].'''
+
==== 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();
+
==== 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}}
+
=== Open Bug Reports for Other Issues ===
  
* '''[http://www.mathworks.com/help/matlab/matlab_oop/mutable-and-immutable-properties.html Immutable property] set access.'''
+
==== Issues with basic classdef functionality ====
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.
+
* [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
  
 +
==== Classdef and +package directories ====
  
* '''Function handles to package methods and static class methods.'''
+
* [https://savannah.gnu.org/bugs/?54941 54941] interpreter cannot find methods in files of classdefs in packages
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:
+
==== Arrays of classdef objects ====
<source lang="octave">
 
classdef method_function_handle_test
 
  
%  properties
+
* [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
+
* [https://savannah.gnu.org/bugs/?47755 47755] Access to object arrays
%  end
+
* [https://savannah.gnu.org/bugs/?47241 47241] classdef: assigning property of handle object in object array constructs new object
 
 
  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
+
==== Debugger (fixes for these are in progress) ====
 
 
  methods (Hidden, Access = protected)
 
    function foo (self)
 
      disp ('hello!');
 
    end
 
  end
 
  
end
+
* [https://savannah.gnu.org/bugs/?46451 46451] unable to set breakpoints within classdef classes
</source>
+
* [https://savannah.gnu.org/bugs/?45404 45404] Breakpoints cannot be set in classdef methods or +package function files
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}}
+
==== Lower-priority issues ====
  
* '''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.'''
+
* [https://savannah.gnu.org/bugs/?55488 55488] Invalid use of colon char as classdef function's argument when subsref is overwritten
For example, the following code gives a syntax/parse error:
+
* [https://savannah.gnu.org/bugs/?54966 54966] Error when assigning array to an object implementing subsasgn() subscripted using "{}"
<source lang="octave">
+
* [https://savannah.gnu.org/bugs/?54028 54028] copy of non-handle class instance is not deep
classdef MyClass
+
* [https://savannah.gnu.org/bugs/?53811 53811] cellfun does not find overloaded function with function name argument
    methods
+
* [https://savannah.gnu.org/bugs/?52989 52989] classdef: missing error messages on multiply defined properties
        function obj = MyClass()
+
* <strike>[https://savannah.gnu.org/bugs/?52614 52614] setting properties of classdef object during construction with inheritance</strike>
            myfunc()
+
* [https://savannah.gnu.org/bugs/?52582 52582] Dependent constant properties in classdef errors: no such file
        end
+
* [https://savannah.gnu.org/bugs/?52123 52123] Indirect memory leak in cdef_manager::initialize ()
    end
+
* [https://savannah.gnu.org/bugs/?51285 51285] max_recursion_depth error in classdef constructor
end
+
* [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
  
function myfunc()
+
==== Documentation ====
    disp('myfunc')
 
end
 
</source>
 
  
See {{bug|41723}}.
+
* [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
* '''debugging in classdef methods (and +package directory functions)'''
+
* [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:
 
<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 ===
 
 
 
* Delete method for handle classes
 
 
 
** [https://savannah.gnu.org/bugs/?46497 46497] classdef: delete destructor method is not called when clearing handle class
 
** [https://savannah.gnu.org/bugs/?53844 53844] handle class: delete destructor method cannot access class properties
 
 
 
* 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/?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 ===
 
=== Classdef examples in the wild ===

Latest revision as of 14:15, 20 May 2019

Supported Features[edit]

Properties[edit]

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[edit]

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[edit]

enumeration[edit]

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 #44582.

events and listeners[edit]

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 #56194.

Open Bug Reports for Other Issues[edit]

Issues with basic classdef functionality[edit]

  • 51659 Calling 'methods' on self causes syntax error
  • 48682 print_usage fails within classdef block
  • 49434 which returns "built-in function" for classdef m-file
  • 48041 classdef: `help myclass` messes up `help @myclass/method`
  • 43047 help() does not see classdef files
  • 42620 exist() does not use "class" argument
  • 53874 doc_cache_create doesnt handle classdef documentation
  • 52096 meta.class.fromName throws error when class name not found.
  • 48693 classdef subsref method is not called with correct nargout value
  • 56006 Object indexing: obj(1).property(end+1:n) - end is interpreted wrong
  • 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
  • 55768 display of classdef object should not show private or protected properties
  • 55766 properties function should not return Hidden properties
  • 55746 interpreter fails to instantiate classdef with classdef properties
  • 52582 using static method to initialize property value fails
  • 45833 support load/save of classdef objects

Classdef and +package directories[edit]

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

Arrays of classdef objects[edit]

  • 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)[edit]

  • 46451 unable to set breakpoints within classdef classes
  • 45404 Breakpoints cannot be set in classdef methods or +package function files

Lower-priority issues[edit]

  • 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
  • 52614 setting properties of classdef object during construction with inheritance
  • 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

Documentation[edit]

  • 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 the wild[edit]