File: Value-Classes-vs_002e-Handle-Classes.html

package info (click to toggle)
octave 10.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 145,388 kB
  • sloc: cpp: 335,976; ansic: 82,241; fortran: 20,963; objc: 9,402; sh: 8,756; yacc: 4,392; lex: 4,333; perl: 1,544; java: 1,366; awk: 1,259; makefile: 659; xml: 192
file content (141 lines) | stat: -rw-r--r-- 4,695 bytes parent folder | download | duplicates (2)
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
<!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>Value Classes vs. Handle Classes (GNU Octave (version 10.3.0))</title>

<meta name="description" content="Value Classes vs. Handle Classes (GNU Octave (version 10.3.0))">
<meta name="keywords" content="Value Classes vs. Handle Classes (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="prev" title="Inheritance">
<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="Value-Classes-vs_002e-Handle-Classes">
<div class="nav-panel">
<p>
Previous: <a href="Inheritance.html" accesskey="p" rel="prev">Inheritance</a>, Up: <a href="classdef-Classes.html" accesskey="u" rel="up"><code class="code">classdef</code> Classes</a> &nbsp; [<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="Value-Classes-vs_002e-Handle-Classes-1"><span>34.6.5 Value Classes vs. Handle Classes<a class="copiable-link" href="#Value-Classes-vs_002e-Handle-Classes-1"> &para;</a></span></h4>

<p>There are two intrinsically different types of <code class="code">classdef</code> classes, whose
major difference is the behavior regarding variable assignment.  The first type
are <b class="b">value classes</b>:
</p>
<div class="example">
<div class="group"><pre class="example-preformatted">classdef value_class
  properties
    prop1
  endproperties

  methods
    function obj = set_prop1 (obj, val)
      obj.prop1 = val;
    endfunction
  endmethods
endclassdef
</pre></div></div>

<p>Assigning an object of that class to another variable essentially creates a new
object:
</p>
<div class="example">
<div class="group"><pre class="example-preformatted">&gt;&gt; a = value_class ();
&gt;&gt; a.prop1 = 1;
&gt;&gt; b = a;
&gt;&gt; b.prop1 = 2;
&gt;&gt; b.prop1
&rArr; ans =  2
&gt;&gt; a.prop1
&rArr; ans =  1
</pre></div></div>

<p>But that also means that you might have to assign the output of a method that
changes properties back to the object manually:
</p>
<div class="example">
<div class="group"><pre class="example-preformatted">&gt;&gt; a = value_class ();
&gt;&gt; a.prop1 = 1;
&gt;&gt; a.set_prop1 (3);
&rArr; ans =

&lt;object value_class&gt;

&gt;&gt; ans.prop1
&rArr; ans =  3
&gt;&gt; a.prop1
&rArr; ans =  1
</pre></div></div>

<p>The second type are <b class="b">handle classes</b>.  Those classes have to be derived from
the abstract <code class="code">handle</code> class:
</p>
<div class="example">
<div class="group"><pre class="example-preformatted">classdef handle_class &lt; handle
  properties
    prop1
  endproperties

  methods
    function set_prop1 (obj, val)
      obj.prop1 = val;
    endfunction
  endmethods
endclassdef
</pre></div></div>

<p>In the following example, the variables <code class="code">a</code> and <code class="code">b</code> refer to the
very same object of class <code class="code">handle_class</code>:
</p>
<div class="example">
<div class="group"><pre class="example-preformatted">&gt;&gt; a = handle_class ();
&gt;&gt; a.prop1 = 1;
&gt;&gt; b = a;
&gt;&gt; b.prop1 = 2;
&gt;&gt; b.prop1
&rArr; ans =  2
&gt;&gt; a.prop1
&rArr; ans =  2
</pre></div></div>

<p>Object properties that are modified by a method of an handle class are changed
persistently:
</p>
<div class="example">
<div class="group"><pre class="example-preformatted">&gt;&gt; a.set_prop1 (3);
&gt;&gt; a.prop1
&rArr; ans =  3
</pre></div></div>


</div>
<hr>
<div class="nav-panel">
<p>
Previous: <a href="Inheritance.html">Inheritance</a>, Up: <a href="classdef-Classes.html"><code class="code">classdef</code> Classes</a> &nbsp; [<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>