octave: Function Overloading

 
 34.4.1 Function Overloading
 ---------------------------
 
 Any Octave function can be overloaded, and this allows an
 object-specific version of a function to be called as needed.  A
 pertinent example for the polynomial class might be to overload the
 ‘polyval’ function.
 
      function [y, dy] = polyval (p, varargin)
      
        if (nargout > 1)
          [y, dy] = polyval (fliplr (p.poly), varargin{:});
        else
          y = polyval (fliplr (p.poly), varargin{:});
        endif
      
      endfunction
 
    This function just hands off the work to the normal Octave ‘polyval’
 function.  Another interesting example of an overloaded function for the
 polynomial class is the ‘plot’ function.
 
      function h = plot (p, varargin)
      
        n = 128;
        rmax = max (abs (roots (p.poly)));
        x = [0 : (n - 1)] / (n - 1) * 2.2 * rmax - 1.1 * rmax;
        if (nargout > 0)
          h = plot (x, polyval (p, x), varargin{:});
        else
          plot (x, polyval (p, x), varargin{:});
        endif
      
      endfunction
 
 which allows polynomials to be plotted in the domain near the region of
 the roots of the polynomial.
 
    Functions that are of particular interest for overloading are the
 class conversion functions such as ‘double’.  Overloading these
 functions allows the ‘cast’ function to work with a user class.  It can
 also aid in the use of a class object with methods and functions from
 other classes since the object can be transformed to the requisite input
 form for the new function.  An example ‘double’ function for the
 polynomial class might look like
 
      function a = double (p)
        a = p.poly;
      endfunction