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

package info (click to toggle)
octave 6.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 124,192 kB
  • sloc: cpp: 322,665; ansic: 68,088; fortran: 20,980; objc: 8,121; sh: 7,719; yacc: 4,266; lex: 4,123; perl: 1,530; java: 1,366; awk: 1,257; makefile: 424; xml: 147
file content (145 lines) | stat: -rw-r--r-- 4,363 bytes parent folder | download
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
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Created by GNU Texinfo 6.7, http://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 6.2.0))</title>

<meta name="description" content="Value Classes vs. Handle Classes (GNU Octave (version 6.2.0))">
<meta name="keywords" content="Value Classes vs. Handle Classes (GNU Octave (version 6.2.0))">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<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="GUI-Development.html" rel="next" title="GUI Development">
<link href="Inheritance.html" rel="prev" title="Inheritance">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.indentedblock {margin-right: 0em}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
kbd {font-style: oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
span.nolinebreak {white-space: nowrap}
span.roman {font-family: initial; font-weight: normal}
span.sansserif {font-family: sans-serif; font-weight: normal}
ul.no-bullet {list-style: none}
-->
</style>
<link rel="stylesheet" type="text/css" href="octave.css">


</head>

<body lang="en">
<span id="Value-Classes-vs_002e-Handle-Classes"></span><div class="header">
<p>
Previous: <a href="Inheritance.html" accesskey="p" rel="prev">Inheritance</a>, Up: <a href="classdef-Classes.html" accesskey="u" rel="up">classdef 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>
<span id="Value-Classes-vs_002e-Handle-Classes-1"></span><h4 class="subsection">34.6.5 Value Classes vs. Handle Classes</h4>

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

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

<p>Assigning an object of that class to another variable essentially creates a new
object:
</p>
<div class="example">
<pre class="example">&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>

<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">
<pre class="example">&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>

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

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

<p>In the following example, the variables <code>a</code> and <code>b</code> refer to the
very same object of class <code>handle_class</code>:
</p>
<div class="example">
<pre class="example">&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>

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






</body>
</html>