Classdef: Difference between revisions

Jump to navigation Jump to search
3,717 bytes added ,  20 May 2019
m
→‎Lower-priority issues: Update bug #52614.
m (→‎Lower-priority issues: Update bug #52614.)
(37 intermediate revisions by 7 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">
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
|
|}


* [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:
=== Features that are not implemented ===
<source lang="octave">
classdef MyClass < handle
end


c = MyClass();
==== enumeration ====
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 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">
cc = {c, c};  % ok
</source>


* [http://www.mathworks.com/help/matlab/matlab_oop/mutable-and-immutable-properties.html Immutable property] set access. Example:
==== events and listeners ====
<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.
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}}.


* Function handles to package methods and static class methods.
=== Open Bug Reports for Other Issues ===
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:
==== Issues with basic classdef functionality ====
<source lang="octave">
classdef method_function_handle_test


%  properties
* [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
%  end
* [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
  properties (Hidden, SetAccess = protected)
* [https://savannah.gnu.org/bugs/?42620 42620] exist() does not use "class" argument
    hfoo = [];% handle to function
* [https://savannah.gnu.org/bugs/?53874 53874] doc_cache_create doesnt handle classdef documentation
  end
* [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
  methods
* [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
    function self = method_function_handle_test ()
* [https://savannah.gnu.org/bugs/?55976 55976] cat, repmat, and reshape don't work for classdef objects
      self.hfoo = @foo;   
* [https://savannah.gnu.org/bugs/?55961 55961] properties function does not preserve order
    end
* [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
    function bar (self)
* [https://savannah.gnu.org/bugs/?55746 55746] interpreter fails to instantiate classdef with classdef properties
        self.hfoo (self);
* [https://savannah.gnu.org/bugs/?52582 52582] using static method to initialize property value fails
    end
* [https://savannah.gnu.org/bugs/?45833 45833] support load/save of classdef objects


  end
==== Classdef and +package directories ====
 
  methods (Hidden, Access = protected)
    function foo (self)
      disp ('hello!');
    end
  end


end
* [https://savannah.gnu.org/bugs/?54941 54941] interpreter cannot find methods in files of classdefs in packages
</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>


==== Arrays of classdef objects ====


* 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/?44665 44665] error in concatenation of classdef objects
<source lang="octave">
* [https://savannah.gnu.org/bugs/?53906 53906] Cannot make an object array with square brackets
classdef MyClass
* [https://savannah.gnu.org/bugs/?47755 47755] Access to object arrays
    methods
* [https://savannah.gnu.org/bugs/?47241 47241] classdef: assigning property of handle object in object array constructs new object
        function obj = MyClass()
            myfunc()
        end
    end
end


function myfunc()
==== Debugger (fixes for these are in progress) ====
    disp('myfunc')
end
</source>


==== supported ====
* [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


* methods
==== Lower-priority issues ====
** static
** private


* properties
* [https://savannah.gnu.org/bugs/?55488 55488] Invalid use of colon char as classdef function's argument when subsref is overwritten
** SetAccess (public/private/protected)
* [https://savannah.gnu.org/bugs/?54966 54966] Error when assigning array to an object implementing subsasgn() subscripted using "{}"
* [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
* <strike>[https://savannah.gnu.org/bugs/?52614 52614] setting properties of classdef object during construction with inheritance</strike>
* [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/?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


==== Classdef examples in the wild ====
==== 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 ===


* http://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/general/inputParser.m
* http://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/general/inputParser.m
* http://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/%2Bcontainers/Map.m
* https://github.com/markuman/go-redis
* https://github.com/markuman/go-redis
* https://github.com/PetrKryslUCSD/FinEALE
* https://github.com/PetrKryslUCSD/FinEALE

Navigation menu