Editing Classdef

Jump to navigation Jump to search

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
=== Supported Features ===
+
This page is a stub. We should begin documenting what classdef is implemented and what is not.
  
==== Properties ====
+
=== Not Supported ===
  
Classdef properties are supported but not all attributes are implemented.
+
* '''debugging in classdef methods (and +package directory functions)'''
  
{| class="wikitable"
+
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).
|-
 
! 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 ====
 
  
Classdef methods are supported but not all attributes are fully implemented.
+
* '''enumeration'''
  
{| class="wikitable"
 
|-
 
! style="text-align:left;"| Attribute
 
! Support
 
! Notes
 
|-
 
|Abstract
 
|Partial
 
|See bug report {{bug|51377}}
 
|-
 
|Access
 
|Yes
 
|
 
|-
 
|Hidden
 
|Yes
 
|
 
|-
 
|Sealed
 
|Yes
 
|
 
|-
 
|Static
 
|Yes
 
|
 
|}
 
  
=== Features that are not implemented ===
+
* build-in class as superclass
 +
<source lang="octave">
 +
classdef nonsense < uint32
  
==== [https://www.mathworks.com/help/matlab/enumeration-classes.html enumeration] ====
+
end
 +
</source>
  
* {{bug|44582}} Parse the enumeration section of a classdef definition but nothing is done with it.
 
  
==== [https://www.mathworks.com/help/matlab/matlab_oop/learning-to-use-events-and-listeners.html events and listeners] ====
+
* '''[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].'''
  
* {{bug|56194}} Parse the events section of a classdef definition but nothing is done with it.
+
Example:
 +
<source lang="octave">
 +
classdef MyClass < handle
 +
end
  
==== [https://www.mathworks.com/help/matlab/matlab_oop/property-validator-functions.html Property Validation Functions] ====
+
c = MyClass();
 +
cc = [c, c];  % won't work
 +
</source>
  
=== Open Bug Reports for Other Issues ===
+
For now you can use a cell-array of objects instead:
 +
<source lang="octave">
 +
cc = {c, c};  % ok
 +
</source>
  
==== Issues with basic classdef functionality ====
 
  
* {{bug|51659}} Calling 'methods' on self causes syntax error
+
* '''[http://www.mathworks.com/help/matlab/matlab_oop/mutable-and-immutable-properties.html Immutable property] set access. Example:'''
* {{bug|48682}} print_usage fails within classdef block
+
<source lang="octave">
* {{bug|49434}} which returns "built-in function" for classdef m-file
+
classdef MyClass < handle
* {{bug|48041}} classdef: `help myclass` messes up `help @myclass/method`
+
    properties (SetAccess = immutable)
* {{bug|43047}} help() does not see classdef files
+
        x
* {{bug|42620}} exist() does not use "class" argument
+
    end
* {{bug|53874}} doc_cache_create doesnt handle classdef documentation
+
    methods
* {{bug|52096}} meta.class.fromName throws error when class name not found.
+
        function obj = MyClass()
* {{bug|48693}} classdef subsref method is not called with correct nargout value
+
            x = rand();
* {{bug|56006}} Object indexing: obj(1).property(end+1:n) - end is interpreted wrong
+
        end
* {{bug|55983}} 'x(ix) = []' deletion syntax does not work for objects
+
    end
* {{bug|55976}} cat, repmat, and reshape don't work for classdef objects
+
end
* {{bug|55961}} properties function does not preserve order
+
</source>
* {{bug|52582}} using static method to initialize property value fails
 
* {{bug|45833}} support load/save of classdef objects
 
  
==== Classdef and +package directories ====
+
Use "private" properties as workaround.
  
* [https://savannah.gnu.org/bugs/?54941 54941] interpreter cannot find methods in files of classdefs in packages
 
  
==== Arrays of classdef objects ====
+
* '''Function handles to package methods and static class methods.'''
 +
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.
  
* {{bug|44665}} error in concatenation of classdef objects
+
A fuller example is also given below:
* {{bug|53906}} Cannot make an object array with square brackets
+
<source lang="octave">
* {{bug|47755}} Access to object arrays
+
classdef method_function_handle_test
* {{bug|47241}} classdef: assigning property of handle object in object array constructs new object
 
  
==== Debugger (fixes for these are in progress) ====
+
%  properties
 +
 +
 +
%  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
  
* {{bug|46451}} unable to set breakpoints within classdef classes
+
  end
* {{bug|45404}} Breakpoints cannot be set in classdef methods or +package function files
+
 
 +
  methods (Hidden, Access = protected)
 +
    function foo (self)
 +
      disp ('hello!');
 +
    end
 +
  end
  
==== Lower-priority issues ====
+
end
 +
</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>
  
* {{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 ====
+
* '''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:
 +
<source lang="octave">
 +
classdef MyClass
 +
    methods
 +
        function obj = MyClass()
 +
            myfunc()
 +
        end
 +
    end
 +
end
  
* {{bug|50729}} Improve OOP documentation
+
function myfunc()
* {{bug|47908}} Octave:classdef-to-struct not documented in warning_ids.m
+
    disp('myfunc')
* {{bug|44590}} More documentation for the current status of classdef implementation
+
end
 +
</source>
  
=== Classdef examples in Octave ===
+
=== Supported ===
  
* [https://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/miscellaneous/inputParser.m inputParser.m]
+
* methods
* [https://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/web/weboptions.m weboptions.m]
+
** static
* [https://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/%2Bcontainers/Map.m +containers/Map.m]
+
** private
  
[[Category:Development]]
+
* properties
 +
** SetAccess (public/private/protected)
 +
 
 +
==== Classdef examples in the wild ====
 +
 
 +
* http://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/general/inputParser.m
 +
* https://github.com/markuman/go-redis
 +
* https://github.com/PetrKryslUCSD/FinEALE

Please note that all contributions to Octave may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see Octave:Copyrights for details). Do not submit copyrighted work without permission!

To edit this page, please answer the question that appears below (more info):

Cancel Editing help (opens in new window)

Template used on this page: