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> [<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"> ¶</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">>> a = value_class ();
>> a.prop1 = 1;
>> b = a;
>> b.prop1 = 2;
>> b.prop1
⇒ ans = 2
>> a.prop1
⇒ 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">>> a = value_class ();
>> a.prop1 = 1;
>> a.set_prop1 (3);
⇒ ans =
<object value_class>
>> ans.prop1
⇒ ans = 3
>> a.prop1
⇒ 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 < 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">>> a = handle_class ();
>> a.prop1 = 1;
>> b = a;
>> b.prop1 = 2;
>> b.prop1
⇒ ans = 2
>> a.prop1
⇒ 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">>> a.set_prop1 (3);
>> a.prop1
⇒ 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> [<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>
|