Classdef: Difference between revisions

Jump to navigation Jump to search
2,223 bytes added ,  12 November 2020
→‎Lower-priority issues: Remove fixed entries.
(→‎not supported: moved debugging problems to the top)
(→‎Lower-priority issues: Remove fixed entries.)
(48 intermediate revisions by 9 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 ====


* debugging in classdef methods (and +package directory functions)
Classdef properties are supported but not all attributes are implemented.


Breakpoints cannot currently be set in classdef methods (or at least they are ignored). They also can't be set in functions in +package directories (which is a related issue).
{| 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.
|}


* enumeration
==== Methods ====


* build-in class as superclass
Classdef methods are supported but not all attributes are fully implemented.
** <source lang="octave" enclose="none">classdef nonsense < uint32</source>


* [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]. Example:
{| class="wikitable"
<source lang="octave">
|-
classdef MyClass < handle
! style="text-align:left;"| Attribute
end
! Support
! Notes
|-
|Abstract
|Partial
|See bug report {{bug|51377}}
|-
|Access
|Yes
|
|-
|Hidden
|Yes
|
|-
|Sealed
|Yes
|
|-
|Static
|Yes
|
|}


c = MyClass();
=== Features that are not implemented ===
cc = [c, c];  % won't work
</source>


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


* [http://www.mathworks.com/help/matlab/matlab_oop/mutable-and-immutable-properties.html Immutable property] set access. Example:
* {{bug|44582}} Parse the enumeration section of a classdef definition but nothing is done with it.
<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://www.mathworks.com/help/matlab/matlab_oop/learning-to-use-events-and-listeners.html events and listeners] ====


* Function handles to package methods and static class methods.
* {{bug|56194}} Parse the events section of a classdef definition but nothing is done with it.
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.  


A fuller example is also given below:
==== [https://www.mathworks.com/help/matlab/matlab_oop/property-validator-functions.html Property Validation Functions] ====
<source lang="octave">
classdef method_function_handle_test


%  properties
=== Open Bug Reports for Other Issues ===
%  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
==== Issues with basic classdef functionality ====
 
  methods (Hidden, Access = protected)
    function foo (self)
      disp ('hello!');
    end
  end


end
* {{bug|51659}} Calling 'methods' on self causes syntax error
</source>
* {{bug|48682}} print_usage fails within classdef block
Then running:
* {{bug|49434}} which returns "built-in function" for classdef m-file
<source lang="text">
* {{bug|48041}} classdef: `help myclass` messes up `help @myclass/method`
>> x = method_function_handle_test
* {{bug|43047}} help() does not see classdef files
error: @foo: no function and no method found
* {{bug|42620}} exist() does not use "class" argument
error: called from
* {{bug|53874}} doc_cache_create doesnt handle classdef documentation
    method_function_handle_test at line 17 column 17
* {{bug|52096}} meta.class.fromName throws error when class name not found.
stopped in <****>/scratch/mfiles/octave_tests/method_function_handle_test.m at line 17
* {{bug|48693}} classdef subsref method is not called with correct nargout value
17:      self.hfoo = @foo;
* {{bug|56006}} Object indexing: obj(1).property(end+1:n) - end is interpreted wrong
</source>
* {{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
* {{bug|52582}} using static method to initialize property value fails
* {{bug|45833}} support load/save of classdef objects


==== Classdef and +package directories ====


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


function myfunc()
==== Arrays of classdef objects ====
    disp('myfunc')
end
</source>


==== supported ====
* {{bug|44665}} error in concatenation of classdef objects
* {{bug|53906}} Cannot make an object array with square brackets
* {{bug|47755}} Access to object arrays
* {{bug|47241}} classdef: assigning property of handle object in object array constructs new object


* methods
==== Debugger (fixes for these are in progress) ====
** static
** private


==== Classdef examples in the wild ====
* {{bug|46451}} unable to set breakpoints within classdef classes
* {{bug|45404}} Breakpoints cannot be set in classdef methods or +package function files


* http://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/general/inputParser.m
==== Lower-priority issues ====
* https://github.com/markuman/go-redis
 
* https://github.com/PetrKryslUCSD/FinEALE
* {{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
 
==== 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
 
=== Classdef examples in Octave ===
 
* [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]
 
[[Category:Development]]

Navigation menu