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
|
<!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>Precedence of Objects (GNU Octave (version 10.3.0))</title>
<meta name="description" content="Precedence of Objects (GNU Octave (version 10.3.0))">
<meta name="keywords" content="Precedence of Objects (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="Overloading-Objects.html" rel="up" title="Overloading Objects">
<link href="Operator-Overloading.html" rel="prev" title="Operator Overloading">
<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}
strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
-->
</style>
<link rel="stylesheet" type="text/css" href="octave.css">
</head>
<body lang="en">
<div class="subsection-level-extent" id="Precedence-of-Objects">
<div class="nav-panel">
<p>
Previous: <a href="Operator-Overloading.html" accesskey="p" rel="prev">Operator Overloading</a>, Up: <a href="Overloading-Objects.html" accesskey="u" rel="up">Overloading Objects</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="Precedence-of-Objects-1"><span>34.4.3 Precedence of Objects<a class="copiable-link" href="#Precedence-of-Objects-1"> ¶</a></span></h4>
<p>Many functions and operators take two or more arguments and the situation can
easily arise where these functions are called with objects of different
classes. It is therefore necessary to determine the precedence of which method
from which class to call when there are mixed objects given to a function or
operator. To do this the <code class="code">superiorto</code> and <code class="code">inferiorto</code> functions can
be used
</p>
<a class="anchor" id="XREFsuperiorto"></a><span style="display:block; margin-top:-4.5ex;"> </span>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-superiorto"><span><strong class="def-name">superiorto</strong> <code class="def-code-arguments">(<var class="var">class_name</var>, …)</code><a class="copiable-link" href="#index-superiorto"> ¶</a></span></dt>
<dd><p>When called from a class constructor, mark the object currently constructed
as having a higher precedence than <var class="var">class_name</var>.
</p>
<p>More that one such class can be specified in a single call. This function
may <em class="emph">only</em> be called from a class constructor.
</p>
<p><strong class="strong">See also:</strong> <a class="ref" href="#XREFinferiorto">inferiorto</a>.
</p></dd></dl>
<a class="anchor" id="XREFinferiorto"></a><span style="display:block; margin-top:-4.5ex;"> </span>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-inferiorto"><span><strong class="def-name">inferiorto</strong> <code class="def-code-arguments">(<var class="var">class_name</var>, …)</code><a class="copiable-link" href="#index-inferiorto"> ¶</a></span></dt>
<dd><p>When called from a class constructor, mark the object currently constructed
as having a lower precedence than <var class="var">class_name</var>.
</p>
<p>More that one such class can be specified in a single call. This function
may <em class="emph">only</em> be called from a class constructor.
</p>
<p><strong class="strong">See also:</strong> <a class="ref" href="#XREFsuperiorto">superiorto</a>.
</p></dd></dl>
<p>With the polynomial class, consider the case
</p>
<div class="example">
<pre class="example-preformatted">2 * polynomial ([1, 0, 1]);
</pre></div>
<p>that mixes an object of the class <code class="code">"double"</code> with an object of the class
<code class="code">"polynomial"</code>. In this case the return type should be
<code class="code">"polynomial"</code> and so the <code class="code">superiorto</code> function is used in the class
constructor. In particular the polynomial class constructor would be modified
to
</p>
<div class="example">
<pre class="verbatim">## -*- texinfo -*-
## @deftypefn {} {} polynomial ()
## @deftypefnx {} {} polynomial (@var{a})
## Create a polynomial object representing the polynomial
##
## @example
## a0 + a1 * x + a2 * x^2 + @dots{} + an * x^n
## @end example
##
## @noindent
## from a vector of coefficients [a0 a1 a2 @dots{} an].
## @end deftypefn
function p = polynomial (a)
if (nargin == 0)
p.poly = [0];
p = class (p, "polynomial");
else
if (strcmp (class (a), "polynomial"))
p = a;
elseif (isreal (a) && isvector (a))
p.poly = a(:).'; # force row vector
p = class (p, "polynomial");
else
error ("@polynomial: A must be a real vector");
endif
endif
superiorto ("double");
endfunction
</pre></div>
<p>Note that user classes <em class="emph">always</em> have higher precedence than built-in
Octave types. Thus, marking the polynomial class higher than the
<code class="code">"double"</code> class is not actually necessary.
</p>
<p>When confronted with two objects of equal precedence, Octave will use the
method of the object that appears first in the list of arguments.
</p>
</div>
<hr>
<div class="nav-panel">
<p>
Previous: <a href="Operator-Overloading.html">Operator Overloading</a>, Up: <a href="Overloading-Objects.html">Overloading Objects</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>
|