Classdef: Difference between revisions

From Octave
Jump to navigation Jump to search
(removed fixed bug reports: #45351 (function handles),)
No edit summary
Line 1: Line 1:
This page is a stub. We should begin documenting what classdef is implemented and what is not.
=== Features that are not implemented ===


=== Not Supported ===
* '''enumeration'''


* '''enumeration'''
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}}.
 
* '''events and listeners'''


See {{bug|44582}} and help implementing it.
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}}.


* '''built-in class as superclass'''


* '''build-in class as superclass'''
Octave does not allow subclassing built-in classes.  In Matlab, classdef objects may subclass built-in integer, floating point, and logical types.  For example,
<source lang="octave">
<source lang="octave">
classdef nonsense < uint32
classdef nonsense < uint32
 
  ...
end
end
</source>
</source>


See {{bug|44035}}
does not work.
 
Progress on this feature is tracked in bug report {{bug|44035}}.
 
* '''concatenation of classdef objects'''


* '''[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].'''
Octave does not support concatenation of classdef objects to create classdef array objects.


Example:
Example:
<source lang="octave">
<source lang="octave">
classdef MyClass < handle
classdef MyClass < handle
Line 33: Line 42:
</source>
</source>


Also see {{bug|44665}}
Progress on this feature is tracked in bug report {{bug|44665}}.


* '''[http://www.mathworks.com/help/matlab/matlab_oop/mutable-and-immutable-properties.html Immutable property] set access.'''
* '''Saving and loading classdef objects'''
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.
Saving and loading classdef objects is not supported.


Progress on this feature is tracked in bug report {{bug|45833}}


* '''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.'''
=== Supported ===
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()
* Methods
    disp('myfunc')
end
</source>


See {{bug|41723}}.
Classdef methods are supported but not all attributes are fully implemented.


* '''debugging in classdef methods (and +package directory functions)'''
{| class="wikitable"
|-
! style="text-align:left;"| Attribute
! Support
! Notes
|-
|Abstract
|Partial
|See bug report {{bug|51377}}
|-
|Access
|Yes
|
|-
|Hidden
|Yes
|
|-
|Sealed
|Yes
|
|-
|Static
|Yes
|
|}


Breakpoints cannot currently be set in classdef methods from the gui, but only from the command line:
* Properties
<source lang="octave">
dbstop @aclass\amethod
</source>
 
See {{bug|45404}}
 
* '''Saving/reading classdef objects to/from (.mat) file'''
 
=== Supported ===


* methods
Classdef properties are supported but not all attributes are implemented.
** static
** private


* properties
{| class="wikitable"
** SetAccess (public/private/protected)
|-
! 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.
|-
|Hidden
|Yes
|
|-
|NonCopyable
|No
|Property does not exist.
|-
|SetAccess
|Partial
|
|-
|SetObservable
|No
|Property exists but is not used.
|-
|Transient
|No
|Property exists but is not used.
|}


=== Open Bug Reports ===
=== Open Bug Reports ===

Revision as of 18:38, 22 April 2019

Features that are not implemented

  • enumeration

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

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.

  • built-in class as superclass

Octave does not allow subclassing built-in classes. In Matlab, classdef objects may subclass built-in integer, floating point, and logical types. For example,

classdef nonsense < uint32
  ...
end

does not work.

Progress on this feature is tracked in bug report #44035.

  • concatenation of classdef objects

Octave does not support concatenation of classdef objects to create classdef array objects.

Example:

classdef MyClass < handle
end

c = MyClass();
cc = [c, c];   % won't work

For now you can use a cell-array of objects instead:

cc = {c, c};   % ok

Progress on this feature is tracked in bug report #44665.

  • Saving and loading classdef objects

Saving and loading classdef objects is not supported.

Progress on this feature is tracked in bug report #45833

Supported

  • 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
  • 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.
Hidden Yes
NonCopyable No Property does not exist.
SetAccess Partial
SetObservable No Property exists but is not used.
Transient No Property exists but is not used.

Open Bug Reports

Issues with basic classdef functionality

  • 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.
  • 51377 Parse error for abstract methods
  • 44665 error in concatenation of classdef objects
  • 44582 classdef: missing support for enumeration
  • 48693 classdef subsref method is not called with correct nargout value

Classdef and +package directories

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

Arrays 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

I/O issues

  • 45833 support load/save of classdef objects

Debugger

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

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
  • 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
  • 44934 classdef parser prints extra newline when failing to parse bad classdef file
  • 44643 classdef handle object can go into an recursive loop with isequal(obj1,obj2) if both are self-referential
  • 44035 classdef is unable to to subclass double

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 the wild