1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
<!DOCTYPE html>
<html>
<!-- Created by GNU Texinfo 7.1.1, https://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Methods (GNU Octave (version 10.3.0))</title>
<meta name="description" content="Methods (GNU Octave (version 10.3.0))">
<meta name="keywords" content="Methods (GNU Octave (version 10.3.0))">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="index.html" rel="start" title="Top">
<link href="Concept-Index.html" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="classdef-Classes.html" rel="up" title="classdef Classes">
<link href="Inheritance.html" rel="next" title="Inheritance">
<link href="Properties.html" rel="prev" title="Properties">
<style type="text/css">
<!--
a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
div.example {margin-left: 3.2em}
span:hover a.copiable-link {visibility: visible}
-->
</style>
<link rel="stylesheet" type="text/css" href="octave.css">
</head>
<body lang="en">
<div class="subsection-level-extent" id="Methods">
<div class="nav-panel">
<p>
Next: <a href="Inheritance.html" accesskey="n" rel="next">Inheritance</a>, Previous: <a href="Properties.html" accesskey="p" rel="prev">Properties</a>, Up: <a href="classdef-Classes.html" accesskey="u" rel="up"><code class="code">classdef</code> Classes</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<h4 class="subsection" id="Methods-1"><span>34.6.3 Methods<a class="copiable-link" href="#Methods-1"> ¶</a></span></h4>
<p>All class methods must be defined within <code class="code">methods</code> blocks. An exception
to this rule is described at the end of this subsection. Those <code class="code">methods</code>
blocks can have additional attributes specifying the access rights or whether
the methods are static, i.e., methods that can be called without creating an
object of that class.
</p>
<div class="example">
<pre class="example-preformatted">classdef some_class
methods
function obj = some_class ()
disp ("New instance created.");
endfunction
function disp (obj)
disp ("Here is some_class.");
endfunction
endmethods
methods (Access = <var class="var">mode</var>)
function r = func (obj, r)
r = 2 * r;
endfunction
endmethods
methods (Static = true)
function c = circumference (radius)
c = 2 * pi () .* radius;
endfunction
endmethods
endclassdef
</pre></div>
<p>The constructor of the class is declared in the <code class="code">methods</code> block and must
have the same name as the class and exactly one output argument which is an
object of its class.
</p>
<p>It is also possible to overload built-in or inherited methods, like the
<code class="code">disp</code> function in the example above to tell Octave how objects of
<code class="code">some_class</code> should be displayed (see <a class="pxref" href="Class-Methods.html">Class Methods</a>).
</p>
<p>In general, the first argument in a method definition is always the object that
it is called from. Class methods can either be called by passing the object as
the first argument to that method or by calling the object followed by a dot
("<code class="code">.</code>") and the method’s name with subsequent arguments:
</p>
<div class="example">
<div class="group"><pre class="example-preformatted">>> obj = some_class ();
New instance created.
>> disp (obj); # both are
>> obj.disp (); # equal
</pre></div></div>
<p>In <code class="code">some_class</code>, the method <code class="code">func</code> is defined within a <code class="code">methods</code>
block setting the <code class="code">Access</code> attribute to <var class="var">mode</var>, which is one of:
</p>
<dl class="table">
<dt><code class="code">public</code></dt>
<dd><p>The methods can be accessed from everywhere.
</p>
</dd>
<dt><code class="code">private</code></dt>
<dd><p>The methods can only be accessed from other class methods. Subclasses of that
class cannot access them.
</p>
</dd>
<dt><code class="code">protected</code></dt>
<dd><p>The methods can only be accessed from other class methods and from subclasses
of that class.
</p></dd>
</dl>
<p>The default access for methods is <code class="code">public</code>.
</p>
<p>Finally, the method <code class="code">circumference</code> is defined in a static <code class="code">methods</code>
block and can be used without creating an object of <code class="code">some_class</code>. This is
useful for methods, that do not depend on any class properties. The class name
and the name of the static method, separated by a dot ("<code class="code">.</code>"), call this
static method. In contrast to non-static methods, the object is not passed as
first argument even if called using an object of <code class="code">some_class</code>.
</p>
<div class="example">
<div class="group"><pre class="example-preformatted">>> some_class.circumference (3)
⇒ ans = 18.850
>> obj = some_class ();
New instance created.
>> obj.circumference (3)
⇒ ans = 18.850
</pre></div></div>
<p>Additionally, class methods can be defined as functions in a folder of the same
name as the class prepended with the ‘<samp class="samp">@</samp>’ symbol
(see <a class="pxref" href="Creating-a-Class.html">Creating a Class</a>). The main <code class="code">classdef</code> file has to be stored in
this class folder as well.
</p>
</div>
<hr>
<div class="nav-panel">
<p>
Next: <a href="Inheritance.html">Inheritance</a>, Previous: <a href="Properties.html">Properties</a>, Up: <a href="classdef-Classes.html"><code class="code">classdef</code> Classes</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>
|