| <!DOCTYPE html |
| PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "../xhtml1-strict.dtd"> |
| <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
| <link rel="stylesheet" type="text/css" href="../css/ot.css" /> |
| <link rel="stylesheet" type="text/css" href="../css/otjld.css" /> |
| <title>OT/J Language Definition v1.3.1</title> |
| </head> |
| <body class="otdt"> |
| <div id="content"> |
| <table class="nav"> |
| <tr> |
| <td class="back"><a id="top"></a><a href="s0.html" rel="prev"><< §0 About this Document</a></td> |
| <td class="top"><a href="index.html" rel="contents">↑ Table of Contents ↑</a></td> |
| <td class="next"><a href="s2.html" rel="next">§2 Role Binding >></a></td> |
| </tr> |
| </table> |
| <div class="chapter" id="s1"> |
| <div class="headl"> |
| <div class="headr"> |
| <h1>§1 Teams and Roles</h1> |
| </div> |
| </div> |
| <div id="toc-box"> |
| <ul class="toc-box"> |
| <li><a href="s1.html">§1 Teams and Roles</a></li> |
| <li><a href="#s1.1">§1.1 Team classes</a></li> |
| <li><a href="#s1.2">§1.2 Role classes and objects</a></li> |
| <li><a href="#s1.3">§1.3 Acquisition and implicit inheritance of role classes</a></li> |
| <li><a href="#s1.4">§1.4 Name clashes</a></li> |
| <li><a href="#s1.5">§1.5 Team and role nesting</a></li> |
| </ul> |
| </div> |
| <div class="intro"> |
| <h3>Fundamental concepts of Teams</h3> |
| <div class="line"></div> |
| <div class="term">Teams and Roles</div> |
| <div class="termdesc">Classes that are defined with the modifier <code>team</code> |
| are called team classes, or <strong>teams</strong> for short.<br /> |
| Direct inner classes of a team are called role classes, or <strong>roles</strong> |
| for short. |
| </div> |
| <div class="line"></div> |
| <div class="term">Role inheritance</div> |
| <div class="termdesc">Inheritance between teams introduces a special inheritance relationship |
| between their contained roles. The rules of this <strong>implicit inheritance</strong> are given below (<a href="#s1.3.1" |
| title="§1.3.1 Acquisition and implicit inheritance of role classes" |
| class="sect">§1.3.1</a>). |
| </div> |
| <div class="line"></div> |
| <div class="term">Externalized role</div> |
| <div class="termdesc">Roles are generally confined to the context of their |
| enclosing team instance. Subject to specific restrictions, |
| a role <em>may</em> be passed outside |
| its team using the concept of externalized roles (<a href="#s1.2.2" title="§1.2.2 Externalized roles" class="sect">§1.2.2</a>). |
| </div> |
| <div class="line"></div> |
| </div> |
| <div class="sect depth2" id="s1.1"> |
| <h2 class="sect">§1.1 Team classes<a class="img" href="s1.html#s1.1" |
| title="PermaLink to §1.1 Team classes"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a><span class="toplink"><a href="#top">↑ §1</a></span></h2> |
| <div class="syntaxlink"><a href="sA.html#sA.1.1" title="§A.1.1 ClassDeclaration" |
| class="syntax">→ Syntax §A.1.1</a></div> |
| <p>A class declared with the modifier <code>team</code> is a <em>team class</em> (or team for short). |
| |
| </p> |
| <div class="listing example frame"> |
| <table class="listing"> |
| <tr class="line odd"> |
| <td class="ln">1</td> |
| <td><pre><b>public</b> <em><b>team</b> <b>class</b> MyTeamA</em> {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">2</td> |
| <td><pre> ...</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">3</td> |
| <td><pre>}</pre></td> |
| </tr> |
| </table> |
| </div> |
| <p>Teams are meant as containers for <em>roles</em>, which are defined in the following |
| paragraphs. |
| |
| </p> |
| <div class="listing example frame"> |
| <table class="listing"> |
| <tr class="line odd"> |
| <td class="ln">1</td> |
| <td><pre><b>public</b> <b>team</b> <b>class</b> MyTeamA {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">2</td> |
| <td><pre> <b>public</b> <em><b>class</b> MyRole</em></pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">3</td> |
| <td><pre> ...</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">4</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">5</td> |
| <td><pre>}</pre></td> |
| </tr> |
| </table> |
| </div> |
| <p>Teams introduce a new variant of inheritance for contained role classes |
| (see <a href="#s1.3.1" |
| title="§1.3.1 Acquisition and implicit inheritance of role classes" |
| class="sect">§1.3.1</a> below). |
| Other properties of teams, which are defined in later sections, are: |
| |
| </p> |
| <ul> |
| <li>Team activation (<a href="s5.html" title="§5 Team Activation" class="sect">§5</a>) |
| </li> |
| <li>Abstractness and instantiation (<a href="s2.html#s2.5" title="§2.5 Abstract Roles" class="sect">§2.5</a>) |
| </li> |
| <li>Declared lifting in team methods (<a href="s2.html#s2.3.2" title="§2.3.2 Declared lifting" |
| class="sect">§2.3.2</a>) |
| </li> |
| <li>Reflective functions defined in <code>org.objectteams.ITeam</code> (<a href="s6.html#s6.1" title="§6.1 Reflection" class="sect">§6.1</a>) |
| </li> |
| </ul> |
| <p>Apart from these differences, team classes are regular Java classes with |
| methods and fields, whose instances are regular Java objects. |
| |
| </p> |
| </div> |
| <div class="sect depth2" id="s1.2"> |
| <h2 class="sect">§1.2 Role classes and objects<a class="img" href="s1.html#s1.2" |
| title="PermaLink to §1.2 Role classes and objects"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a><span class="toplink"><a href="#top">↑ §1</a></span></h2> |
| <p>Each direct inner class of a team is a role class. |
| Just like inner classes, each instance of a role class has an implicit reference |
| to its enclosing team instance. This reference is immutable. |
| Within the implementation of a role it can be accessed by qualifying the identifier |
| <code>this</code> with the name of the team class, as in: |
| |
| </p> |
| <div class="listing example frame"> |
| <table class="listing"> |
| <tr class="line odd"> |
| <td class="ln">1</td> |
| <td><pre><b>public</b> <b>team</b> <b>class</b> MyTeamA {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">2</td> |
| <td><pre> <b>public</b> <em><b>class</b> MyRole</em> {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">3</td> |
| <td><pre> <b>public</b> <b>void</b> print() { System.out.println("Team: "+ <em>MyTeamA.this</em>); }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">4</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">5</td> |
| <td><pre>}</pre></td> |
| </tr> |
| </table> |
| </div> |
| <p>Creation of role instances is further restricted as defined in |
| <a href="s2.html#s2.4" title="§2.4 Explicit role creation" |
| class="sect">§2.4</a>. |
| Teams can also define role interfaces just like role classes. |
| With respect to role specific properties a role interface is treated like a fully |
| abstract class. |
| |
| </p> |
| <div class="sect depth3" id="s1.2.1"> |
| <h3 class="sect">§1.2.1 Modifiers for roles<a class="img" href="s1.html#s1.2.1" |
| title="PermaLink to §1.2.1 Modifiers for roles"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a><span class="toplink"><a href="#s1.2">↑ §1.2</a></span></h3> |
| <p>Member classes of a team cannot be <code>static</code>. |
| Also the use of access modifiers for roles is restricted and modifiers have different (stronger) semantics than for |
| regular classes (see below). With respect to accessibility a team acts mainly like a package regarding its roles. |
| |
| </p> |
| <div class="subsect depth4" id="s1.2.1.a"> |
| <h4 class="subsect">(a) <span class="title">Role class protection</span><a class="img" href="s1.html#s1.2.1.a" |
| title="PermaLink to (a) Role class protection"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A role class must have exactly one of the access modifiers <code>public</code> |
| or <code>protected</code>.<br /> |
| This rule does not affect the class modifiers <code>abstract</code>, <code>final</code> and <code>strictfp</code>. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.1.b"> |
| <h4 class="subsect">(b) <span class="title">protected role classes</span><a class="img" href="s1.html#s1.2.1.b" |
| title="PermaLink to (b) protected role classes"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A <code>protected</code> role can only be accessed from within the enclosing |
| team or any of its sub-teams. The actual border of encapsulation is the |
| enclosing team <em>instance</em>. The rules for protected roles are given |
| in <a href="#s1.2.3" title="§1.2.3 Protected roles" class="sect">§1.2.3</a> below. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.1.c"> |
| <h4 class="subsect">(c) <span class="title">public role classes</span><a class="img" href="s1.html#s1.2.1.c" |
| title="PermaLink to (c) public role classes"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Only <code>public</code> roles can ever be accessed outside their enclosing team. |
| Accessing a role outside the enclosing team instance is governed by the rules |
| of <strong>externalized roles</strong>, to be defined next (<a href="#s1.2.2" title="§1.2.2 Externalized roles" class="sect">§1.2.2</a>). |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.1.d"> |
| <h4 class="subsect">(d) <span class="title">abstract role classes</span><a class="img" href="s1.html#s1.2.1.d" |
| title="PermaLink to (d) abstract role classes"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A role class has to be marked <strong>abstract</strong> if any of its methods |
| is not effective.<br /> |
| The <em>methods of a role class</em> comprise direct methods and |
| methods acquired by inheritance. |
| In addition to regular inheritance a role class may acquire methods |
| also via implicit inheritance (<a href="#s1.3.1" |
| title="§1.3.1 Acquisition and implicit inheritance of role classes" |
| class="sect">§1.3.1</a>).<br /> |
| A method may become <em>effective</em> by either: |
| |
| </p> |
| <ul> |
| <li>implementation (i.e., a regular method body), or</li> |
| <li>a callout binding (see <a href="s3.html" title="§3 Callout Binding" class="sect">§3</a>). |
| </li> |
| </ul> |
| <p><a href="s2.html#s2.5" title="§2.5 Abstract Roles" class="sect">§2.5</a> discusses under which |
| circumstances abstract roles force the enclosing team to be abstract, too. |
| |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.1.e"> |
| <h4 class="subsect">(e) <span class="title">Role features</span><a class="img" href="s1.html#s1.2.1.e" |
| title="PermaLink to (e) Role features"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Access modifiers for members of roles have some special interpretation: |
| |
| </p> |
| <ol> |
| <li>A private member is also visible in any implicit sub role |
| (see implicit inheritance <a href="#s1.3.1.c" |
| title="§1.3.1.(c) Overriding and implicit inheritance" |
| class="sect">§1.3.1.(c)</a>).<br /> |
| In contrast to inner classes in Java, private members of a role are not |
| visible to the enclosing team. |
| </li> |
| <li>The default visibility of role members restricts access to the |
| current class and its sub-classes (explicit and implicit). |
| </li> |
| <li><code>protected</code> role members can only be accessed from the enclosing |
| team or via <a href="s4.html" title="§4 Callin Binding" class="sect">callin (§4)</a>. |
| </li> |
| <li><code>public</code> role members grant unrestricted access. |
| </li> |
| </ol> |
| <p>Additionally, a role always has access to all the features that its enclosing team has access to.</p> |
| <p>Only <code>public</code> members can ever be accessed via an <a href="#s1.2.2" title="§1.2.2 Externalized roles" class="sect">externalized role (§1.2.2)</a>. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.1.f"> |
| <h4 class="subsect">(f) <span class="title">Static role methods</span><a class="img" href="s1.html#s1.2.1.f" |
| title="PermaLink to (f) Static role methods"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>In contrast to inner classes in pure Java, a role class may indeed define static methods. A static role method requires no |
| role |
| instance <em>but</em> it still requires a team instance in scope. Static role methods can be called: |
| |
| </p> |
| <ul> |
| <li>from the enclosing team,</li> |
| <li>via callin (see <a href="s4.html#s4.7" |
| title="§4.7 Callin binding with static methods" |
| class="sect">§4.7</a>). |
| </li> |
| </ul> |
| <p>Within a static role method the syntax <code>MyTeam.this</code> is available for accessing the enclosing team instance. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.1.g"> |
| <h4 class="subsect">(g) <span class="title">No static initializers</span><a class="img" href="s1.html#s1.2.1.g" |
| title="PermaLink to (g) No static initializers"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A static field of a role class must not have a non-constant initialization expression. |
| Static initialization blocks are already prohibited for inner classes by Java (see <a href="http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#262890" |
| class="ext">JLS §8.1.2</a>). |
| |
| </p> |
| <div class="note"> |
| <h5>Note:</h5> |
| Static initialization generally provides a means for performing initialization code prior to instantiation, i.e., at |
| class-loading time. |
| Before any role can be created already two levels of initialization are performed: (1) The (outer most) enclosing team |
| class performs static initializations when it is loaded. (2) Any enclosing team executes |
| its constructor when it is instantiated. It should be possible to allocate any early initialization to either of these |
| two phases instead of using static role initializers. |
| |
| </div> |
| </div> |
| </div> |
| <div class="sect depth3" id="s1.2.2"> |
| <h3 class="sect">§1.2.2 Externalized roles<a class="img" href="s1.html#s1.2.2" |
| title="PermaLink to §1.2.2 Externalized roles"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a><span class="toplink"><a href="#s1.2">↑ §1.2</a></span></h3> |
| <div class="syntaxlink"><a href="sA.html#sA.9.2" title="§A.9.2 ActualTypeArgument" |
| class="syntax">→ Syntax §A.9.2</a></div> |
| <p>Normally, a team encapsulates its role against unwanted access from the outside. |
| If roles are visible outside their enclosing team instance we speak of |
| <strong>externalized roles</strong>. |
| |
| </p> |
| <p>Externalized roles are subject to specific typing rules in order to ensure, |
| that role instances from different team instances cannot be mixed in |
| inconsistent ways. In the presence of implicit inheritance |
| (<a href="#s1.3.1" |
| title="§1.3.1 Acquisition and implicit inheritance of role classes" |
| class="sect">§1.3.1</a>) inconsistencies could otherwise occur, which lead |
| to typing errors that could only be detected at run-time. |
| Externalized roles use the theory of |
| "virtual classes" <a href="#fn1-virtual-classes" class="int">[1]</a>, |
| or more specifically |
| "family polymorphism" <a href="#fn2-family-polymorphism" class="int">[2]</a>, |
| in order to achieve the desired type safety. |
| These theories use special forms of <em>dependent types</em>. |
| Externalized roles have <em>types that depend on a team instance</em>. |
| |
| </p> |
| <p><a href="#s1.2.3" title="§1.2.3 Protected roles" class="sect">§1.2.3</a> deduces even stronger forms of encapsulation |
| from the rules about externalized roles. |
| |
| </p> |
| <div class="subsect depth4" id="s1.2.2.a"> |
| <h4 class="subsect">(a) <span class="title">Visibility</span><a class="img" href="s1.html#s1.2.2.a" title="PermaLink to (a) Visibility"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Only instances of a <code>public</code> role class can ever be externalized. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.2.b"> |
| <h4 class="subsect">(b) <span class="title">Declaration with anchored type</span><a class="img" href="s1.html#s1.2.2.b" |
| title="PermaLink to (b) Declaration with anchored type"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Outside a team role types are legal only if denoted relative |
| to an existing team instance (further on called "anchored types"). |
| The syntax is: |
| </p> |
| <div class="listing plain"><pre><em>final</em> MyTeam myTeam = <i>expression</i>; |
| <em>RoleClass<@myTeam></em> role = <i>expression</i>;</pre></div> |
| <p>The syntax <code>Type<@anchor></code> is a special case of a parameterized type, more specifically a <a href="s9.html" title="§9 Value Dependent Classes" class="sect">value dependent type (§9)</a>. |
| The type argument (i.e., the expression after the at-sign) can be a simple name or a path. It must refer to an instance |
| of a team class. |
| The role type is said to be <em>anchored</em> to this team instance.<br /> |
| The type-part of this syntax (in front of the angle brackets) must be the simple name of a role type directly contained |
| in the given team (including roles that are acquired by implicit inheritance).<br /></p> |
| <div class="note"> |
| <h5>Note:</h5> |
| Previous versions of the OTJLD used a different syntax for anchored types, where the role type was prefixed with the anchor |
| expression, separated by a dot (<code>anchor.Type</code>, |
| see <a href="sA.html#sA.6.3" title="§A.6.3 AnchoredType" class="sect">§A.6.3</a>). A compiler may still support that path syntax but it should be flagged as being deprecated. |
| |
| </div> |
| </div> |
| <div class="subsect depth4" id="s1.2.2.c"> |
| <h4 class="subsect">(c) <span class="title">Immutable anchor</span><a class="img" href="s1.html#s1.2.2.c" |
| title="PermaLink to (c) Immutable anchor"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Anchoring the type of an externalized role to a team instance |
| requires the team to be referenced by a variable which |
| is marked <code>final</code> (i.e., immutable). |
| The type anchor can be a path <code>v.f1.f2...</code> where |
| <code>v</code> is any final variable and <code>f1</code> ... |
| are final fields. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.2.d"> |
| <h4 class="subsect">(d) <span class="title">Implicit type anchors</span><a class="img" href="s1.html#s1.2.2.d" |
| title="PermaLink to (d) Implicit type anchors"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>The current team instance can be used as a default anchor |
| for role types: |
| |
| </p> |
| <ol> |
| <li>In non-static team level methods role types are by default interpreted as anchored to <code>this</code> (referring to the team instance). I.e., the following two declarations express the same: |
| |
| <div class="listing plain"><pre><b>public</b> RoleX getRoleX (RoleY r) { <i> stmts </i> } |
| <b>public</b> RoleX<@<em>this</em>> getRoleX (RoleY<@<em>this</em>> r) { <i> stmts </i> }</pre></div> |
| </li> |
| <li> |
| In analogy, <em>role methods</em> use the enclosing team instance as the |
| default anchor for any role types. |
| </li> |
| </ol> |
| <p>Note, that <code>this</code> and <code><em>Outer</em>.this</code> are always |
| <code>final</code>.<br /> |
| The compiler uses the pseudo identifier <strong><code>tthis</code></strong> to denote |
| such implicit type anchors in error messages. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.2.e"> |
| <h4 class="subsect">(e) <span class="title">Conformance</span><a class="img" href="s1.html#s1.2.2.e" title="PermaLink to (e) Conformance"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Conformance between |
| two types <code>RoleX<@teamA></code> and <code>RoleY<@teamB></code> |
| not only requires the role types to be compatible, but also |
| the team instances to be provably <em>the same object</em>. |
| The compiler must be able to statically analyze anchor identity. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.2.f"> |
| <h4 class="subsect">(f) <span class="title">Substitutions for type anchors</span><a class="img" href="s1.html#s1.2.2.f" |
| title="PermaLink to (f) Substitutions for type anchors"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Only two substitutions are considered for determining |
| team identity: |
| |
| </p> |
| <ol> |
| <li> |
| For type checking the application of team methods, |
| <code>this</code> is <strong>substituted</strong> by the actual call target. |
| For role methods a reference of the form <code><em>Outer</em>.this</code> |
| is substituted by the enclosing instance of the call target. |
| |
| </li> |
| <li>Assignments from a <code>final</code> identifier |
| to another <code>final</code> identifier are transitively |
| followed, i.e., if <code>t1, t2</code> are final, |
| after an assignment <code>t1=t2</code> |
| the types <code>R<@t1></code> and <code>R<@t2></code> are considered |
| identical. Otherwise <code>R<@t1></code> and <code>R<@t2></code> |
| are incommensurable.<br /> |
| Attaching an actual parameter to a formal parameter in a |
| method call is also considered as an assignment with respect to |
| this rule. |
| |
| </li> |
| </ol> |
| </div> |
| <div class="subsect depth4" id="s1.2.2.g"> |
| <h4 class="subsect">(g) <span class="title">Legal contexts</span><a class="img" href="s1.html#s1.2.2.g" |
| title="PermaLink to (g) Legal contexts"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Anchored types for externalized roles may be used in the |
| following contexts: |
| |
| </p> |
| <ol> |
| <li>Declaration of an attribute</li> |
| <li>Declaration of a local variable</li> |
| <li>Declaration of a parameter or result type |
| of a method or constructor |
| </li> |
| <li>In the <code>playedBy</code> clause of a role class |
| (see <a href="s2.html#s2.1" title="§2.1 playedBy relation" class="sect">§2.1</a>). |
| </li> |
| </ol> |
| <p>It is not legal to inherit from an anchored type, since |
| this would require membership of the referenced team instance, |
| which can only be achieved by class nesting. |
| |
| </p> |
| <div class="note"> |
| <h5>Note:</h5> |
| Item 4. |
| — within the given restriction — admits the case where |
| the same class is a role of one team and the base class for |
| the role of another team. Another form of nesting is |
| defined in <a href="#s1.5" title="§1.5 Team and role nesting" class="sect">§1.5</a>. |
| |
| </div> |
| </div> |
| <div class="subsect depth4" id="s1.2.2.h"> |
| <h4 class="subsect">(h) <span class="title">Externalized creation</span><a class="img" href="s1.html#s1.2.2.h" |
| title="PermaLink to (h) Externalized creation"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A role can be created as externalized using either of these equivalent forms:</p> |
| <div class="listing plain"><pre>outer.<b>new</b> Role() |
| <b>new</b> Role<@outer>()</pre></div> |
| <p>This requires the enclosing instance <code>outer</code> to be |
| declared <code>final</code>. The expression has the |
| type <code>Role<@outer></code> following the rules of |
| externalized roles.<br /> |
| The type <code>Role</code> in this expression must be a simple |
| (unqualified) name. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.2.i"> |
| <h4 class="subsect">(i) <span class="title">No import</span><a class="img" href="s1.html#s1.2.2.i" title="PermaLink to (i) No import"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>It is neither useful nor legal to import a role type.<br /></p> |
| <div class="note"> |
| <h5>Rationale:</h5> |
| Importing a type allows to use the unqualified name in situations that would otherwise require to use the fully qualified |
| name, |
| i.e., the type prefixed with its containing package and enclosing class. Roles, however are contained in a team <i>instance</i>. |
| Outside their team, role types can only be accessed using an anchored type which uses a team instance to qualify the |
| role type. |
| Relative to this team anchor, roles are <i>always</i> denoted using their simple name, which makes importing roles useless. |
| |
| </div> |
| <p>A static import for a constant declared in a role is, however, legal. |
| |
| </p> |
| </div> |
| <h5 class="listing">Example code (Externalized Roles):</h5> |
| <div class="listing example frame" id="l1.2.2-1"> |
| <table class="listing"> |
| <tr class="line odd"> |
| <td class="ln">1</td> |
| <td><pre><b>team</b> <b>class</b> FlightBonus <b>extends</b> Bonus {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">2</td> |
| <td><pre> <b>public</b> <b>class</b> Subscriber {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">3</td> |
| <td><pre> <b>void</b> clearCredits() { ... }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">4</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">5</td> |
| <td><pre> <b>void</b> unsubscribe(Subscriber subscr) { ... }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">6</td> |
| <td><pre>}</pre></td> |
| </tr> |
| </table> |
| </div> |
| <div class="listing example frame" id="l1.2.2-2"> |
| <table class="listing"> |
| <tr class="line odd"> |
| <td class="ln">7</td> |
| <td><pre><b>class</b> ClearAction <b>extends</b> Action {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">8</td> |
| <td><pre> <em>final</em> FlightBonus context;</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">9</td> |
| <td><pre> <em>Subscriber<@context></em> subscriber;</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">10</td> |
| <td><pre> ClearAction (<em>final</em> FlightBonus bonus, <em>Subscriber<@bonus></em> subscr) {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">11</td> |
| <td><pre> context = bonus; <span class="comment">// unique assignment to 'context'</span></pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">12</td> |
| <td><pre> subscriber = subscr;</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">13</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">14</td> |
| <td><pre> <b>void</b> actionPerformed () {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">15</td> |
| <td><pre> subscriber.clearCredits();</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">16</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">17</td> |
| <td><pre> <b>protected</b> <b>void</b> finalize () {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">18</td> |
| <td><pre> context.unsubscribe(subscriber);</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">19</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">20</td> |
| <td><pre>}</pre></td> |
| </tr> |
| </table> |
| </div> |
| <div class="codecomment"> |
| <h5>Effects:</h5> |
| <ul> |
| <li>Lines 1-6 show a terse extract of a published example |
| <a href="http://www.objectteams.org/publications/index.html#NODe02" class="ext">[NODe02]</a>. Here passengers can be subscribers in a flight bonus program. |
| </li> |
| <li>Lines 7-20 show a sub-class of <code>Action</code> which is |
| used to associate the action of resetting a subscriber's credits |
| to a button or similar element in an application's GUI. |
| </li> |
| <li>Attribute <code>context</code> (line 8) and parameter |
| <code>bonus</code> (line 10) serve as anchor for the type of |
| externalized roles. |
| </li> |
| <li>Attribute <code>subscriber</code> (line 9) and parameter |
| <code>subscr</code> (line 10) store a Subscriber role outside the |
| FlightBonus team. |
| </li> |
| <li>In order to type-check the assignment in line 12, the compiler |
| has to ensure that the types of LHS and RHS are anchored to |
| the same team instance. This can be verified by checking that |
| both anchors are indeed <code>final</code> and prior to the |
| role assignment a team assignment has taken place (line 11).<br /><span class="underline">Note,</span> that the Java rules for <strong>definite assignments</strong> to |
| final variables ensure that exactly one assignment to a variable occurs |
| prior to its use as type anchor. No further checks are needed. |
| |
| </li> |
| <li>It is now legal to store this role reference and use it at |
| some later point in time, e.g., for invoking method |
| <code>clearCredits</code> (line 15). |
| This method call is also an example for implicit team activation |
| (<a href="s5.html#s5.3.b" |
| title="§5.3.(b) Methods of externalized roles" |
| class="sect">§5.3.(b)</a>). |
| |
| </li> |
| <li>Line 18 demonstrates how an externalized role can be |
| passed to a team level method. The signature of <code>unsubscribe</code> |
| is for this call expanded to |
| <div class="indent"> |
| void unsubscribe(Subscriber<@context> subscr) |
| |
| </div> |
| (by substituting the call target <code>context</code> for |
| <code>this</code>). This proves identical types for actual and |
| formal parameters. |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect depth3" id="s1.2.3"> |
| <h3 class="sect">§1.2.3 Protected roles<a class="img" href="s1.html#s1.2.3" |
| title="PermaLink to §1.2.3 Protected roles"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a><span class="toplink"><a href="#s1.2">↑ §1.2</a></span></h3> |
| <p>Roles can only be <code>public</code> or <code>protected</code>. |
| A <code>protected</code> role is encapsulated |
| by its enclosing team instance. This is enforced by these rules: |
| |
| </p> |
| <div class="subsect depth4" id="s1.2.3.a"> |
| <h4 class="subsect">(a) <span class="title">Importing role classes</span><a class="img" href="s1.html#s1.2.3.a" |
| title="PermaLink to (a) Importing role classes"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p><i>This rule is superseded by <a href="#s1.2.2.i" title="§1.2.2.(i) No import" class="sect">§1.2.2.(i)</a></i></p> |
| </div> |
| <div class="subsect depth4" id="s1.2.3.b"> |
| <h4 class="subsect">(b) <span class="title">Qualified role types</span><a class="img" href="s1.html#s1.2.3.b" |
| title="PermaLink to (b) Qualified role types"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>The name of a <code>protected</code> role class may never be used qualified, neither |
| prefixed by its <em>enclosing type</em> nor parameterized by a <em>variable as type anchor</em> (cf. <a href="#s1.2.2.a" title="§1.2.2.(a) Visibility" class="sect">§1.2.2.(a)</a>). |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.3.c"> |
| <h4 class="subsect">(c) <span class="title">Mixing qualified and unqualified types</span><a class="img" href="s1.html#s1.2.3.c" |
| title="PermaLink to (c) Mixing qualified and unqualified types"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>An externalized role type is never compatible to an unqualified role type, |
| except for the substitutions in <a href="#s1.2.2.f" |
| title="§1.2.2.(f) Substitutions for type anchors" |
| class="sect">§1.2.2.(f)</a>, where |
| an explicit anchor can be matched with the implicit anchor <code>this</code>. |
| |
| </p> |
| </div> |
| <p>Rules (a) and (b) ensure that the name of a protected role class cannot be used |
| outside the lexical scope of its enclosing team. Rule (c) ensures that team methods |
| containing unqualified role types in their signature cannot be invoked on a team other |
| than the current team. Accordingly, for role methods the team context must be the |
| enclosing team instance. |
| |
| </p> |
| <div class="subsect depth4" id="s1.2.3.d"> |
| <h4 class="subsect">(d) <span class="title">Levels of encapsulation</span><a class="img" href="s1.html#s1.2.3.d" |
| title="PermaLink to (d) Levels of encapsulation"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Since protected role types can not be used for externalization, instances of these types are already quite effectively encapsulated |
| by their enclosing team. |
| Based on this concept, encapsulation for protected roles can be made even stricter by the rules of <em>role confinement</em>. |
| On the contrary, even protected roles can be externalized as <em>opaque roles</em> which still expose (almost) no information. |
| Confinement and opaque roles are subject of <a href="s7.html" title="§7 Role Encapsulation" class="sect">§7</a>. |
| |
| </p> |
| </div> |
| </div> |
| <div class="sect depth3" id="s1.2.4"> |
| <h3 class="sect">§1.2.4 Type tests and casts<a class="img" href="s1.html#s1.2.4" |
| title="PermaLink to §1.2.4 Type tests and casts"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a><span class="toplink"><a href="#s1.2">↑ §1.2</a></span></h3> |
| <p>In accordance with <a href="#s1.2.2.e" title="§1.2.2.(e) Conformance" class="sect">§1.2.2.(e)</a>, in OT/J |
| the <code>instanceof</code> operator and type casts have extended semantics for roles. |
| |
| </p> |
| <div class="subsect depth4" id="s1.2.4.a"> |
| <h4 class="subsect">(a) <span class="title">instanceof</span><a class="img" href="s1.html#s1.2.4.a" title="PermaLink to (a) instanceof"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>For role types the <code>instanceof</code> operator yields true only if |
| both components of the type match: the dynamic role type must be compatible |
| to the given static type, and also type anchors must be the same instance. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.4.b"> |
| <h4 class="subsect">(b) <span class="title">Casting</span><a class="img" href="s1.html#s1.2.4.b" title="PermaLink to (b) Casting"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Casts may also fail if the casted expression is anchored to a different |
| team instance than the cast type. Such failure is signaled by a |
| <code>org.objectteams.RoleCastException</code>. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.4.c"> |
| <h4 class="subsect">(c) <span class="title">Class literal</span><a class="img" href="s1.html#s1.2.4.c" |
| title="PermaLink to (c) Class literal"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A class literal of form <code>R.class</code> is dynamically bound to the class <code>R</code> |
| visible in the current instance context. Using a class literal for a role outside its |
| enclosing team instance (see <a href="#s1.2.2" title="§1.2.2 Externalized roles" class="sect">§1.2.2</a>) requires the following syntax: |
| |
| </p> |
| <div class="listing plain"><pre>RoleClass<em><@teamAnchor></em><strong>.class</strong></pre></div> |
| </div> |
| </div> |
| <div class="sect depth3" id="s1.2.5"> |
| <h3 class="sect">§1.2.5 File structure<a class="img" href="s1.html#s1.2.5" |
| title="PermaLink to §1.2.5 File structure"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a><span class="toplink"><a href="#s1.2">↑ §1.2</a></span></h3> |
| <p>Just like regular inner classes, role classes may be inlined in the |
| source code of the enclosing team. As an alternative style it is possible |
| to store role classes in separate <strong>role files</strong> according to the following rules: |
| |
| </p> |
| <div class="subsect depth4" id="s1.2.5.a"> |
| <h4 class="subsect">(a) <span class="title">Role directory</span><a class="img" href="s1.html#s1.2.5.a" |
| title="PermaLink to (a) Role directory"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>In the directory of the team class a new directory is created |
| which has the same name as the team without the <tt>.java</tt> suffix. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.5.b"> |
| <h4 class="subsect">(b) <span class="title">Role files</span><a class="img" href="s1.html#s1.2.5.b" title="PermaLink to (b) Role files"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Role classes are stored in this directory (a). The file names are |
| derived from the role class name extended by <tt>.java</tt>.<br /> |
| A role file must contain exactly one top-level type. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.5.c"> |
| <h4 class="subsect">(c) <span class="title">package statement</span><a class="img" href="s1.html#s1.2.5.c" |
| title="PermaLink to (c) package statement"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A role class in a role file declares as its package the fully qualified |
| name of the enclosing team class. The package statement of a role file |
| must use the <code>team</code> modifier as its first token. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.5.d"> |
| <h4 class="subsect">(d) <span class="title">Reference to role file</span><a class="img" href="s1.html#s1.2.5.d" |
| title="PermaLink to (d) Reference to role file"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A team should mention in its javadoc comment each role class which |
| is stored externally using a <tt>@role</tt> tag. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.5.e"> |
| <h4 class="subsect">(e) <span class="title">Legal types in role files</span><a class="img" href="s1.html#s1.2.5.e" |
| title="PermaLink to (e) Legal types in role files"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>The type in a role file must not be an <code>enum</code>. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.2.5.f"> |
| <h4 class="subsect">(f) <span class="title">Imports in role files</span><a class="img" href="s1.html#s1.2.5.f" |
| title="PermaLink to (f) Imports in role files"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A role file may have imports of its own. |
| Within the role definition these imports are visible <em>in addition</em> to all imports of the enclosing team. |
| Only <code>base</code> imports (see <a href="s2.html#s2.1.2.d" title="§2.1.2.(d) Base imports" |
| class="sect">§2.1.2.(d)</a>) |
| <em>must</em> be defined in the team. |
| </p> |
| </div> |
| <p>Semantically, there is no difference between inlined role classes and those |
| stored in separate role files. |
| |
| </p> |
| <div class="note"> |
| <h5>Note:</h5> |
| Current Java compilers disallow a type to have the same fully qualified |
| name as a package. However, the JLS does not seem to make a statement in this respect. |
| In OT/J, a package and a type are interpreted as being the same team, if both have the |
| same fully qualified name and both have the <code>team</code> modifier. |
| |
| </div> |
| <h5 class="listing">Role file example:</h5> |
| <div class="listing example frame" id="l1.2.5-1"> |
| <table class="listing"> |
| <tr class="lhead"> |
| <td colspan="2">in file <code>org/objectteams/examples/MyTeamA.java</code> : |
| </td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">1</td> |
| <td><pre><b>package</b> org.objectteams.examples;</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">2</td> |
| <td><pre><span class="comment">/**</span></pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">3</td> |
| <td><pre> <span class="comment">* @author Stephan Herrmann</span></pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">4</td> |
| <td><pre> <span class="comment">* @date 20.02.2007</span></pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">5</td> |
| <td><pre> <span class="comment">* @file MyTeamA.java</span></pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">6</td> |
| <td><pre> <span class="comment">* <em>@role MyRole</em></span></pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">7</td> |
| <td><pre> <span class="comment">*/</span></pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">8</td> |
| <td><pre><b>public</b> <b>team</b> <b>class</b> MyTeamA {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">9</td> |
| <td><pre> ...</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">10</td> |
| <td><pre>}</pre></td> |
| </tr> |
| </table> |
| </div> |
| <div class="listing example frame" id="l1.2.5-2"> |
| <table class="listing"> |
| <tr class="lhead"> |
| <td colspan="2">in file <code>org/objectteams/examples<strong class="blue">/MyTeamA/MyRole.java</strong></code>: |
| </td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">1</td> |
| <td><pre><em><b>team</b> <b>package</b> org.objectteams.examples.MyTeamA;</em></pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">2</td> |
| <td><pre><b>public</b> <b>class</b> MyRole {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">3</td> |
| <td><pre> ...</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">4</td> |
| <td><pre>}</pre></td> |
| </tr> |
| </table> |
| </div> |
| </div> |
| </div> |
| <div class="sect depth2" id="s1.3"> |
| <h2 class="sect">§1.3 Acquisition and implicit inheritance of role classes<a class="img" href="s1.html#s1.3" |
| title="PermaLink to §1.3 Acquisition and implicit inheritance of role classes"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a><span class="toplink"><a href="#top">↑ §1</a></span></h2> |
| <p> Every team class implicitly implements the predefined interface <code>org.objectteams.ITeam</code>. |
| If a team class has no explicit <code>extends</code> clause it implicitly extends <code>org.objectteams.Team</code>, |
| thus providing implementations for the methods in <code>org.objectteams.ITeam</code>. |
| If a team class extends a non-team class, the compiler implicitly adds implementations for all methods declared |
| in <code>org.objectteams.ITeam</code> to the team class. |
| Any subclass of a team (including <code>org.objectteams.Team</code>) must again be a team. |
| Interface implementation is not affected by this rule. |
| |
| </p> |
| <p>Infrastructure provided via interface <code>org.objectteams.ITeam</code> is presented in <a href="s6.html" title="§6 Object Teams API" class="sect">§6</a>. |
| |
| </p> |
| <div class="sect depth3" id="s1.3.1"> |
| <h3 class="sect">§1.3.1 Acquisition and implicit inheritance of role classes<a class="img" href="s1.html#s1.3.1" |
| title="PermaLink to §1.3.1 Acquisition and implicit inheritance of role classes"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a><span class="toplink"><a href="#s1.3">↑ §1.3</a></span></h3> |
| <p>A team acquires all roles from its super-team. This relation is |
| similar to inheritance of inner classes, but with a few decisive |
| differences as defined next. Two implementation options are mentioned <a href="#aux1.1" class="int">below</a>, |
| which can be used to realize the special semantics of role |
| acquisition (virtual classes and copy inheritance). |
| |
| </p> |
| <h5 class="listing">Implicit role inheritance</h5> |
| <div class="listing example frame" id="l1.3.1-1"> |
| <table class="listing"> |
| <tr class="line odd"> |
| <td class="ln">1</td> |
| <td><pre><b>public</b> <b>team</b> <b>class</b> S {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">2</td> |
| <td><pre> <b>protected</b> <b>class</b> R0 {...}</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">3</td> |
| <td><pre> <b>protected</b> <b>class</b> R1 <em><b>extends</b> R0</em> {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">4</td> |
| <td><pre> <b>boolean</b> ok;</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">5</td> |
| <td><pre> R2 m() {...}</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">6</td> |
| <td><pre> <b>void</b> n(<em>R2</em> r) {...}</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">7</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">8</td> |
| <td><pre> <b>protected</b> <b>class</b> R2 {...}</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">9</td> |
| <td><pre>}</pre></td> |
| </tr> |
| </table> |
| </div> |
| <div class="listing example frame" id="l1.3.1-2"> |
| <table class="listing"> |
| <tr class="line odd"> |
| <td class="ln">10</td> |
| <td><pre><b>public</b> <b>team</b> <b>class</b> T <em><b>extends</b> S</em> {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">11</td> |
| <td><pre> @Override <b>protected</b> <em><b>class</b> R1</em> {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">12</td> |
| <td><pre> <strong>R2</strong> m() {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">13</td> |
| <td><pre> if(<em>ok</em>) { <b>return</b> <em>tsuper</em>.m(); }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">14</td> |
| <td><pre> <b>else</b> { <b>return</b> null; }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">15</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">16</td> |
| <td><pre> <b>void</b> doIt() {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">17</td> |
| <td><pre> n(m());</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">18</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">19</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">20</td> |
| <td><pre>}</pre></td> |
| </tr> |
| </table> |
| </div> |
| <div class="subsect depth4" id="s1.3.1.a"> |
| <h4 class="subsect">(a) <span class="title">Role class acquisition</span><a class="img" href="s1.html#s1.3.1.a" |
| title="PermaLink to (a) Role class acquisition"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A team <code>T</code> which extends a super-team <code>S</code> |
| has one role class <code>T.R</code> corresponding to each role <code>S.R</code> |
| of the super-team. |
| The new type <code>T.R</code> <strong>overrides</strong> <code>R</code> for the |
| context of <code>T</code> and its roles. |
| Acquisition of role classes can either be direct (see (b) below), or |
| it may involve overriding and implicit inheritance ((c) below). |
| |
| </p> |
| <div class="codecomment">In the above example (<a href="#l1.3.1-1" class="listing">Listing 1.3.1-1</a>) the team <code>S</code> operates |
| on types <code>S.R0</code>, <code>S.R1</code> and <code>S.R2</code>, |
| while <code>T</code> operates on types <code>T.R0</code>, <code>T.R1</code> |
| and <code>T.R2</code>.<br /><em>(Type references like "<code>S.R0</code>" are actually illegal in source code |
| (<a href="#s1.2.3.b" title="§1.2.3.(b) Qualified role types" |
| class="sect">§1.2.3.(b)</a>). Here they are used for explanatory purposes only)</em></div> |
| </div> |
| <div class="subsect depth4" id="s1.3.1.b"> |
| <h4 class="subsect">(b) <span class="title">Direct role acquisition</span><a class="img" href="s1.html#s1.3.1.b" |
| title="PermaLink to (b) Direct role acquisition"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Within a sub-team <code>T</code> each role <code>S.R</code> of its |
| super-team <code>S</code> is available by the simple name <code>R</code> |
| without further declaration. |
| |
| </p> |
| <div class="codecomment">The role <code>R2</code> in <a href="#l1.3.1-1" class="listing">Listing 1.3.1-1</a> can be used in the sub-team |
| <code>T</code> (line 12), because this role type is defined in the super class of the enclosing team. |
| |
| </div> |
| </div> |
| <div class="subsect depth4" id="s1.3.1.c"> |
| <h4 class="subsect">(c) <span class="title">Overriding and implicit inheritance</span><a class="img" href="s1.html#s1.3.1.c" |
| title="PermaLink to (c) Overriding and implicit inheritance"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>If a team contains a role class definition by the same name as |
| a role defined in its super-team, |
| the new role class overrides the corresponding role from the super-team |
| and <strong>implicitly inherits</strong> all of its features. |
| Such relation is established only by name correspondence. |
| |
| </p> |
| <p>A role that overrides an inherited role should be marked with an <code>@Override</code> annotation. |
| A compiler should optionally flag a missing <code>@Override</code> annotation with a warning. |
| Conversely, it is an error if a role is marked with an <code>@Override</code> annotation but does not actually |
| override an inherited role. |
| |
| </p> |
| <p>It is an error to override a role class with an interface or vice versa. A final role cannot be overridden.<br /> |
| Unlike regular inheritance, <strong>constructors</strong> are also inherited |
| along implicit inheritance, and can be overridden just like normal methods. |
| |
| </p> |
| <div class="codecomment"> |
| In <a href="#l1.3.1-1" class="listing">Listing 1.3.1-1</a><code> R1</code> in <code>T</code> implicitly inherits all features of |
| <code>R1</code> in <code>S</code>. This is, because its enclosing team |
| <code>T</code> extends the team <code>S</code> (line 10) and the role |
| definition uses the same name <code>R1</code> (line 11). |
| Hence the attribute <code><strong>ok</strong></code> is available in the method |
| <code>m()</code> in <code>T.R1</code> (line 13). <code>T.R1</code> also overrides <code>S.R1</code> |
| which is marked by the <code>@Override</code> annotation in line 11. |
| |
| </div> |
| </div> |
| <div class="subsect depth4" id="s1.3.1.d"> |
| <h4 class="subsect">(d) <span class="title">Lack of subtyping</span><a class="img" href="s1.html#s1.3.1.d" |
| title="PermaLink to (d) Lack of subtyping"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Direct acquisition of roles from a super-team and implicit inheritance |
| do not establish a <strong>subtype</strong> relation. |
| A role of a given team is never conform (i.e., substitutable) |
| to any role of any <em>other</em> team. |
| <code>S.R</code> and <code>T.R</code> are always incommensurable.<br /><span class="underline">Note,</span> that this rule is a direct consequence of <a href="#s1.2.2.e" title="§1.2.2.(e) Conformance" class="sect">§1.2.2.(e)</a>. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.3.1.e"> |
| <h4 class="subsect">(e) <span class="title">Dynamic binding of types</span><a class="img" href="s1.html#s1.3.1.e" |
| title="PermaLink to (e) Dynamic binding of types"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Overriding an acquired role by a new role class has the following |
| implication: If an expression or declaration, which is evaluated on behalf of |
| an instance of team <code>T</code> or one of its contained roles, |
| refers to a role <code>R</code>, <code>R</code> will always |
| resolve to <code>T.R</code> even if <code>R</code> was introduced in |
| a super-team of <code>T</code> and even if the specific line of code |
| was inherited from a super-team or one of its roles. |
| Only the dynamic type of the enclosing team-instance is used to determine |
| the correct role class (see below for an example). |
| |
| </p> |
| <p>A special case of dynamically binding role types relates to so-called class literals |
| (see <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#251530" |
| class="ext">JLS §15.8.2</a>). |
| Role class literals are covered in <a href="s6.html#s6.1.c" title="§6.1.(c) Class literals for roles" |
| class="sect">§6.1.(c)</a>. |
| |
| </p> |
| <p>The above is strictly needed only for cases involving implicit inheritance. |
| It may, however, help intuition, to also consider the directly acquired |
| role <code>T.R</code> in (b) to override the given role <code>S.R</code>. |
| |
| </p> |
| <div class="codecomment"> |
| In line 17 of <a href="#l1.3.1-1" class="listing">Listing 1.3.1-1</a> the implicitly inherited method <code>n</code> is called |
| with the result of an invocation of <code>m</code>. Although |
| <code>n</code> was defined in <code>S</code> (thus with argument type |
| <code>S.R2, see line 6</code>) in the context of <code>T</code> it |
| expects an argument of <code>T.R2</code>. This is correctly provided by |
| the invocation of <code>m</code> in the context of <code>T</code>. |
| |
| </div> |
| </div> |
| <div class="subsect depth4" id="s1.3.1.f"> |
| <h4 class="subsect">(f) <span class="title">tsuper</span><a class="img" href="s1.html#s1.3.1.f" title="PermaLink to (f) tsuper"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <div class="syntaxlink"><a href="sA.html#sA.5.4" title="§A.5.4 TSuperCall" class="syntax">→ Syntax §A.5.4</a></div> |
| <p>Super calls along implicit inheritance use the new keyword |
| <strong>tsuper</strong>. While <code>super</code> is still available |
| along regular inheritance, a call <code>tsuper.m()</code> |
| selects the version of <code>m</code> of the corresponding role |
| acquired from the super-team. |
| |
| </p> |
| <p>See <a href="s2.html#s2.4.2" |
| title="§2.4.2 Role creation via a regular constructor" |
| class="sect">§2.4.2</a> for <code>tsuper</code> |
| in the context of role constructors. |
| |
| </p> |
| <p><code>tsuper</code> can only be used to invoke a corresponding |
| version of the enclosing method or constructor, i.e., an expression |
| <code>tsuper.m()</code> may only occur within the method <code>m</code> |
| with both methods having the same signature |
| (see <a href="s2.html#s2.3.2.b" |
| title="§2.3.2.(b) Super in the context of declared lifting" |
| class="sect">§2.3.2.(b)</a> for an exception, where both methods have slightly different signatures). |
| |
| </p> |
| <div class="codecomment"> |
| In <a href="#l1.3.1-1" class="listing">Listing 1.3.1-1</a> the role <code>R1</code> in team <code>T</code> |
| overrides the implicitly inherited method <code>m()</code> from <code>S</code>. <code><strong>tsuper</strong>.m()</code> calls the overridden method <code>m()</code> |
| from <code>S.R1</code> (line 13). |
| |
| </div> |
| </div> |
| <div class="subsect depth4" id="s1.3.1.g"> |
| <h4 class="subsect">(g) <span class="title">Implicitly inheriting super-types</span><a class="img" href="s1.html#s1.3.1.g" |
| title="PermaLink to (g) Implicitly inheriting super-types"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>If a role class has an explicit super class (using <code>extends</code>) |
| this relation is inherited along implicit inheritance. |
| |
| </p> |
| <div class="codecomment"> |
| In <a href="#l1.3.1-1" class="listing">Listing 1.3.1-1</a> the role <code>R1</code> in <code>T</code> has <code>T.R0</code> |
| as its implicitly inherited super class, because the corresponding role in the super-team |
| <code><strong>extends R0</strong></code> (line 3). |
| |
| </div> |
| <p>Overriding an implicitly inherited super class is governed by |
| <a href="#s1.3.2.b" |
| title="§1.3.2.(b) Inheriting and overriding the extends clause" |
| class="sect">§1.3.2.(b)</a>, below.<br /> |
| The list of implemented interfaces is merged along implicit |
| inheritance. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.3.1.h"> |
| <h4 class="subsect">(h) <span class="title">Preserving visibility</span><a class="img" href="s1.html#s1.3.1.h" |
| title="PermaLink to (h) Preserving visibility"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A role class must provide at least as much access as the implicit super role, |
| or a compile-time error occurs (this is in analogy to <a href="http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#227965" |
| class="ext">JLS §8.4.6.3</a>). |
| Access rights of methods overridden by implicit inheritance follow |
| the same rules as for normal overriding. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.3.1.i"> |
| <h4 class="subsect">(i) <span class="title">Dynamic binding of constructors</span><a class="img" href="s1.html#s1.3.1.i" |
| title="PermaLink to (i) Dynamic binding of constructors"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>When creating a role instance using <code>new</code> not only the |
| type to instantiate is bound dynamically (cf. <a href="#s1.3.1.e" title="§1.3.1.(e) Dynamic binding of types" |
| class="sect">§1.3.1.(e)</a>), but also the constructor to |
| invoke is dynamically bound in accordance to the concrete |
| type.<br /> |
| Within role constructors all <code>this(..)</code> and |
| <code>super(..)</code> calls are bound statically with respect to explicit inheritance |
| and dynamically with respect to implicit inheritance. This means the target role name is |
| determined statically, but using that name the suitable role type is determined |
| using dynamic binding. |
| <br /> |
| See also <a href="s2.html#s2.5.a" |
| title="§2.5.(a) Using abstract classes for creation" |
| class="sect">§2.5.(a)</a> on using constructors of abstract role classes. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.3.1.j"> |
| <h4 class="subsect">(j) <span class="title">Overriding and compatibility</span><a class="img" href="s1.html#s1.3.1.j" |
| title="PermaLink to (j) Overriding and compatibility"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>The rules of <a href="http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#228745" |
| class="ext">JLS §8.4.6</a> |
| also apply to methods <em>and constructors</em> inherited via implicit inheritance. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.3.1.k"> |
| <h4 class="subsect">(k) <span class="title">Covariant return types</span><a class="img" href="s1.html#s1.3.1.k" |
| title="PermaLink to (k) Covariant return types"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Given a team <code>T1</code> with two roles <code>R1</code> and <code>R2</code> where <code>R2</code> explicitly inherits from <code>R1</code>, both roles defining |
| a method <code>m</code> returning some type <code>A</code>. |
| Given also a sub-team of <code>T1</code>, <code>T2</code>, where <code>T2.R1</code> overrides <code>m</code> with a covariant return type <code>B</code> |
| (sub-type of <code>A</code>): |
| |
| </p> |
| <div class="listing plain"><pre> <b>public</b> <b>team</b> <b>class</b> T1 { |
| <b>protected</b> <b>abstract</b> <b>class</b> R1 { |
| <b>abstract</b> A m(); |
| } |
| <b>protected</b> <b>class</b> R2 <b>extends</b> R1 { |
| A m() { <b>return</b> <b>new</b> A(); } |
| } |
| } |
| <b>public</b> <b>team</b> <b>class</b> T2 <b>extends</b> T1 { |
| <b>protected</b> <b>class</b> R1 { |
| @Override B m() { <b>return</b> <b>new</b> B(); } <span class="error">// this declaration renders <b>class</b> T2.R2 illegal</span> |
| } |
| }</pre></div> |
| <p> |
| In this situation role <code>T2.R2</code> will be illegal unless also overriding <code>m</code> with a return type that is at least <code>B</code>. |
| Note, that the actual error occurs at the implicitly inherited method <code>T2.R2.m</code> which is not visible in the source code, |
| even <code>T2.R2</code> need not be mentioned explicitly in the source code. |
| A compiler should flag this as an imcompatibility at the team level, because a team must specialize inherited roles |
| in a consistent way. |
| |
| </p> |
| </div> |
| <h5 class="listing">Example code (Teams and Roles):</h5> |
| <div class="listing example frame" id="l1.3.1-3"> |
| <table class="listing"> |
| <tr class="line odd"> |
| <td class="ln">1</td> |
| <td><pre><b>public</b> <b>team</b> <b>class</b> MyTeamA {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">2</td> |
| <td><pre> <b>protected</b> <b>class</b> MyRole {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">3</td> |
| <td><pre> String name;</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">4</td> |
| <td><pre> <b>public</b> MyRole (String n) { name = n; }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">5</td> |
| <td><pre> <b>public</b> <b>void</b> print() { System.out.println("id="+name); }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">6</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">7</td> |
| <td><pre> <b>protected</b> MyRole getRole() { <b>return</b> <b>new</b> MyRole("Joe"); }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">8</td> |
| <td><pre>}</pre></td> |
| </tr> |
| </table> |
| </div> |
| <div class="listing example frame" id="l1.3.1-4"> |
| <table class="listing"> |
| <tr class="line odd"> |
| <td class="ln">10</td> |
| <td><pre><b>public</b> <b>team</b> <b>class</b> MySubTeam <b>extends</b> MyTeamA {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">11</td> |
| <td><pre> <b>protected</b> <b>class</b> MyRole {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">12</td> |
| <td><pre> <b>int</b> age;</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">13</td> |
| <td><pre> <b>public</b> <b>void</b> setAge(<b>int</b> a) { age = a; }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">14</td> |
| <td><pre> <b>public</b> <b>void</b> print() {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">15</td> |
| <td><pre> tsuper.print();</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">16</td> |
| <td><pre> System.out.println("age="+age);</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">17</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">18</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">19</td> |
| <td><pre> <b>public</b> <b>void</b> doit() {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">20</td> |
| <td><pre> MyRole r = getRole();</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">21</td> |
| <td><pre> r.setAge(27);</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">22</td> |
| <td><pre> r.print();</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">23</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">24</td> |
| <td><pre>}</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">25</td> |
| <td><pre>...</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">26</td> |
| <td><pre>MySubTeam myTeam = <b>new</b> MySubTeam();</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">27</td> |
| <td><pre>myTeam.doit();</pre></td> |
| </tr> |
| </table> |
| </div> |
| <h5 class="listing">Program output</h5> |
| <div class="listing example frame"><pre>id=Joe |
| age=27</pre></div> |
| <div class="codecomment"> |
| <h5>Effects:</h5> |
| <ul> |
| <li>According to <a href="#s1.3" |
| title="§1.3 Acquisition and implicit inheritance of role classes" |
| class="sect">§1.3</a>, <code>MyTeamA</code> implements |
| <code>ITeam</code> (line 1). |
| </li> |
| <li>An implicit role inheritance is created for |
| <code>MySubTeam.MyRole</code> (<a href="#s1.3.1.c" |
| title="§1.3.1.(c) Overriding and implicit inheritance" |
| class="sect">§1.3.1.(c)</a>; line 11).<br /> |
| If we visualize this special inheritance using a fictitious keyword |
| <code>overrides</code> the compiler would see a declaration: |
| |
| <div class="listing plain"><pre><b>protected</b> <b>class</b> MyRole <em>overrides MyTeamA.MyRole</em> { ... }</pre></div> |
| </li> |
| <li>Invoking <code>getRole()</code> on <code>myTeam</code> (line 27, 20) |
| creates an instance of <code>MySubTeam.MyRole</code> because the |
| acquired role <code>MyTeamA.MyRole</code> is overridden by |
| <code>MySubTeam.MyRole</code> |
| following the rules of implicit inheritance (cf. <a href="#s1.3.1.e" title="§1.3.1.(e) Dynamic binding of types" |
| class="sect">§1.3.1.(e)</a>). |
| |
| </li> |
| <li>Overriding of role methods and access to inherited features works as usual. |
| |
| </li> |
| <li>As an example for <a href="#s1.3.1.f" title="§1.3.1.(f) tsuper" class="sect">§1.3.1.(f)</a> see the call <code>tsuper.print()</code> |
| (line 15), which selects the implementation of <code>MyTeamA.MyRole.print</code>. |
| |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect depth3" id="s1.3.2"> |
| <h3 class="sect">§1.3.2 Regular role inheritance<a class="img" href="s1.html#s1.3.2" |
| title="PermaLink to §1.3.2 Regular role inheritance"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a><span class="toplink"><a href="#s1.3">↑ §1.3</a></span></h3> |
| <p>In addition to implicit inheritance, roles may also inherit using |
| the standard Java keyword <code>extends</code>. These restrictions apply: |
| |
| </p> |
| <div class="subsect depth4" id="s1.3.2.a"> |
| <h4 class="subsect">(a) <span class="title">Super-class restrictions</span><a class="img" href="s1.html#s1.3.2.a" |
| title="PermaLink to (a) Super-class restrictions"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>If the super-class of a role is again a role it must be a direct role of |
| an enclosing team |
| This rule is simply enforced by disallowing type anchors in the |
| <code>extends</code> clause |
| (see <a href="#s1.2.2.g" title="§1.2.2.(g) Legal contexts" class="sect">§1.2.2.(g)</a>). |
| As an effect, the super-class may never be more deeply nested than the sub-class. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.3.2.b"> |
| <h4 class="subsect">(b) <span class="title">Inheriting and overriding the extends clause</span><a class="img" href="s1.html#s1.3.2.b" |
| title="PermaLink to (b) Inheriting and overriding the extends clause"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>If a role overrides another role by implicit inheritance, it may |
| change the inherited <code>extends</code> clause |
| (see <a href="#s1.3.1.g" |
| title="§1.3.1.(g) Implicitly inheriting super-types" |
| class="sect">§1.3.1.(g)</a> above) only if the new super-class |
| is a sub-class of the class in the overridden extends clause. |
| I.e., an implicit sub-role may <em>specialize</em> the extends clause of its |
| implicit super-role. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.3.2.c"> |
| <h4 class="subsect">(c) <span class="title">Constructors and overridden 'extends' </span><a class="img" href="s1.html#s1.3.2.c" |
| title="PermaLink to (c) Constructors and overridden 'extends' "><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Each constructor of a role class that overrides the extends clause of its |
| implicit super-role must invoke a constructor of this newly introduced |
| explicit super-class. Thus it may not use a <code>tsuper</code> constructor |
| (see <a href="s2.html#s2.4.2" |
| title="§2.4.2 Role creation via a regular constructor" |
| class="sect">§2.4.2</a>). |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.3.2.d"> |
| <h4 class="subsect">(d) <span class="title">Adding implemented interfaces</span><a class="img" href="s1.html#s1.3.2.d" |
| title="PermaLink to (d) Adding implemented interfaces"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p><code>implements</code> declarations are additive, i.e., an implicit |
| sub-role may add more interfaces but has to implement all interfaces of |
| its implicit super-role, too. |
| |
| </p> |
| </div> |
| <div class="subsect depth4" id="s1.3.2.e"> |
| <h4 class="subsect">(e) <span class="title">Visibility of inherited methods</span><a class="img" href="s1.html#s1.3.2.e" |
| title="PermaLink to (e) Visibility of inherited methods"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p> |
| When a role inherits non-public methods from a regular class (as its super class), |
| these methods are considered as private for the role, i.e., they can only be |
| accessed in an unqualified method call <code>m()</code> using the implicit receiver <code>this</code>. |
| |
| </p> |
| </div> |
| </div> |
| </div> |
| <div class="sect depth2" id="s1.4"> |
| <h2 class="sect">§1.4 Name clashes<a class="img" href="s1.html#s1.4" |
| title="PermaLink to §1.4 Name clashes"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a><span class="toplink"><a href="#top">↑ §1</a></span></h2> |
| <p>OT/J restricts Java with respect to handling of conflicting names. |
| |
| </p> |
| <div class="subsect depth3" id="s1.4.a"> |
| <h4 class="subsect">(a) <span class="title">Names of role classes</span><a class="img" href="s1.html#s1.4.a" |
| title="PermaLink to (a) Names of role classes"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A role class may not have the same name as a method or field of |
| its enclosing team. A role class may not shadow another class that is visible in the scope of the enclosing team. |
| |
| </p> |
| </div> |
| <div class="subsect depth3" id="s1.4.b"> |
| <h4 class="subsect">(b) <span class="title">Names of role methods and fields</span><a class="img" href="s1.html#s1.4.b" |
| title="PermaLink to (b) Names of role methods and fields"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>Along implicit inheritance, the names of methods or fields may |
| not hide, shadow or obscure any previously visible name.<br /> |
| (see JLS <a href="http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#40898" |
| class="ext">§8.3</a>, |
| <a href="http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#227928" |
| class="ext">§8.4.6.2</a>, |
| <a href="http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#246026" |
| class="ext">§8.5</a>, |
| <a href="http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html#78642" |
| class="ext">§9.3</a>, |
| <a href="http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html#252566" |
| class="ext">§9.5</a> (hiding), |
| <a href="http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#34133" |
| class="ext">§6.3.1</a> (shadowing), |
| <a href="http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#104058" |
| class="ext">§6.3.2</a> (obscuring). |
| |
| </p> |
| </div> |
| </div> |
| <div class="sect depth2" id="s1.5"> |
| <h2 class="sect">§1.5 Team and role nesting<a class="img" href="s1.html#s1.5" |
| title="PermaLink to §1.5 Team and role nesting"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a><span class="toplink"><a href="#top">↑ §1</a></span></h2> |
| <p>Multi-level nesting of classes is restricted only by the following rules. |
| |
| </p> |
| <h5 class="listing">Example code (Nesting):</h5> |
| <div class="listing example frame" id="l1.5"> |
| <table class="listing"> |
| <tr class="line odd"> |
| <td class="ln">1</td> |
| <td><pre><b>public</b> <b>team</b> <b>class</b> SuperOuter {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">2</td> |
| <td><pre> <b>public</b> <em><b>team</b> <b>class</b> RoleAndTeam</em> {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">3</td> |
| <td><pre> <b>protected</b> <b>class</b> InnerRole {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">4</td> |
| <td><pre> Runnable foo() { <b>return</b> null; }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">5</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">6</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">7</td> |
| <td><pre> <b>public</b> <em><b>team</b> <b>class</b> RoleAndTeamSub</em> <b>extends</b> <strong>RoleAndTeam</strong> {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">8</td> |
| <td><pre> <b>protected</b> <b>class</b> InnerRole {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">9</td> |
| <td><pre> Runnable foo() { <b>throw</b> <b>new</b> RuntimeException(); }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">10</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">11</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">12</td> |
| <td><pre>}</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">13</td> |
| <td><pre><b>public</b> <b>team</b> <b>class</b> OuterTeam <b>extends</b> SuperOuter {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">14</td> |
| <td><pre> <b>public</b> <em><b>team</b> <b>class</b> RoleAndTeam</em> {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">15</td> |
| <td><pre> <b>protected</b> <b>class</b> InnerRole {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">16</td> |
| <td><pre> Runnable foo() {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">17</td> |
| <td><pre> <b>class</b> Local {};</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">18</td> |
| <td><pre> <b>return</b> <b>new</b> Runnable() { <span class="comment">// anonymous class definition</span></pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">19</td> |
| <td><pre> <b>public</b> <b>void</b> run() {}</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">20</td> |
| <td><pre> };</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">21</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">22</td> |
| <td><pre> <span class="comment">// <span class="error">class IllegalMember {}</span></span></pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">23</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">24</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">25</td> |
| <td><pre> <b>public</b> <em><b>team</b> <b>class</b> RoleAndTeamSub</em> {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">26</td> |
| <td><pre> <b>protected</b> <b>class</b> InnerRole {</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">27</td> |
| <td><pre> Runnable foo() {</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">28</td> |
| <td><pre> <em>RoleAndTeamSub.tsuper</em>.foo();</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">29</td> |
| <td><pre> <b>return</b> <em>OuterTeam.tsuper</em>.foo();</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">30</td> |
| <td><pre> };</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">31</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line even"> |
| <td class="ln">32</td> |
| <td><pre> }</pre></td> |
| </tr> |
| <tr class="line odd"> |
| <td class="ln">33</td> |
| <td><pre>}</pre></td> |
| </tr> |
| </table> |
| </div> |
| <div class="subsect depth3" id="s1.5.a"> |
| <h4 class="subsect">(a) <span class="title">Nested teams</span><a class="img" href="s1.html#s1.5.a" title="PermaLink to (a) Nested teams"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>If a role class is also marked using the <code>team</code> modifier, |
| it may contain roles at the next level of nesting. |
| |
| </p> |
| <div class="codecomment"> |
| <ul> |
| <li>In the above example (<a href="#l1.5" class="listing">Listing 1.5</a>) class <code>RoleAndTeam</code> starting in line 14 |
| is a role of <code>OuterTeam</code> and at the same time a |
| team containing a further role <code>InnerRole</code></li> |
| </ul> |
| </div> |
| <p>Such a hybrid role-and-team has all properties of both kinds of classes. |
| |
| </p> |
| </div> |
| <div class="subsect depth3" id="s1.5.b"> |
| <h4 class="subsect">(b) <span class="title">Nested classes of roles</span><a class="img" href="s1.html#s1.5.b" |
| title="PermaLink to (b) Nested classes of roles"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A regular role class (ie., not marked as <code>team</code>, see above) |
| may contain local types (see <a href="http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#247766" |
| class="ext">JLS §14.3</a> |
| - in the example: class <code>Local</code>), anonymous types |
| (<a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#252986" |
| class="ext">JLS §15.9.5</a> |
| - in the example: class defined in lines 18-20) |
| but no member types (<a href="http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#246026" |
| class="ext">JLS §8.5</a> |
| - in the example: illegal class |
| <code>IllegalMember</code>). |
| <br /> |
| The effect is, that nested types of a regular role cannot be |
| used outside the scope of their enclosing role. |
| |
| </p> |
| </div> |
| <div class="subsect depth3" id="s1.5.c"> |
| <h4 class="subsect">(c) <span class="title">Prohibition of cycles</span><a class="img" href="s1.html#s1.5.c" |
| title="PermaLink to (c) Prohibition of cycles"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A nested team may not extend its own enclosing team. |
| |
| </p> |
| </div> |
| <div class="subsect depth3" id="s1.5.d"> |
| <h4 class="subsect">(d) <span class="title">Prohibition of name clashes</span><a class="img" href="s1.html#s1.5.d" |
| title="PermaLink to (d) Prohibition of name clashes"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A nested team may inherit roles from multiple sources: its explicit super team |
| and any of its implicit super classes (roles) from different levels of nesting. |
| If from different sources a team inherits two or more roles of the same name |
| that are not related by implicit inheritance, this is an illegal name clash. |
| |
| </p> |
| </div> |
| <div class="subsect depth3" id="s1.5.e"> |
| <h4 class="subsect">(e) <span class="title">Precedence among different supers</span><a class="img" href="s1.html#s1.5.e" |
| title="PermaLink to (e) Precedence among different supers"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>If a role inherits the same feature from several super roles (super and tsuper), |
| an implicitly inherited version always overrides any explicitly inherited feature, |
| i.e., a role with the same simple name is closer related than one with a different name. |
| </p> |
| <p> |
| Also implicit inheritance alone may produce several candidate methods inherited by a role class. |
| This is a result of team-nesting where each level of nesting may add one more tsuper role |
| if outer teams also participate in an inheritance relationship. |
| In this case a role inherited from an <em>implicit</em> super team of the enclosing team |
| is closer related than a role inherited from an <em>explicit</em> super team. |
| If necessary this rule is applied inside out until a nesting level is found where indeed |
| explicit team inheritance is involved.<br /> |
| So when comparing classes by their fully qualified names |
| the longest common suffix will determine the closest relationship. |
| E.g., <code>SuperOuter.RoleAndTeamSub.InnerRole</code> |
| is the closest ancestor of <code>SubOuter.RoleAndTeamSub.InnerRole</code> |
| because both share the name suffix <code>RoleAndTeamSub.InnerRole</code>. |
| |
| </p> |
| <div class="codecomment"> |
| <table> |
| <colgroup span="1"> |
| <col align="left" span="1" /> |
| <col align="center" span="1" /> |
| </colgroup> |
| <tr> |
| <td valign="top" rowspan="1" colspan="1"> |
| <p>In the above example (<a href="#l1.5" class="listing">Listing 1.5</a>) role <code class="small">OuterTeam.RoleAndTeamSub.InnerRole</code> |
| has two direct tsuper roles: |
| <code class="small">OuterTeam.RoleAndTeam.InnerRole</code> and <code class="small">SuperOuter.RoleAndTeamSub.InnerRole</code>. |
| Without the method <code>foo</code> defined in lines 27-30, the enclosing class <code class="small">OuterTeam.RoleAndTeamSub.InnerRole</code> |
| would inherit the method <code>foo</code> defined in <code>SuperOuter.RoleAndTeamSub.InnerRole</code> (line 9), |
| because the common name suffix <code>RoleAndTeamSub.InnerRole</code> |
| creates a stronger relationship making that class the closest ancestor. |
| </p> |
| </td> |
| <td rowspan="1" colspan="1"><img src="../images/team_nesting_hor.png" alt="Example diagram team nesting" /></td> |
| </tr> |
| </table> |
| </div> |
| </div> |
| <div class="subsect depth3" id="s1.5.f"> |
| <h4 class="subsect">(f) <span class="title">Qualified tsuper</span><a class="img" href="s1.html#s1.5.f" |
| title="PermaLink to (f) Qualified tsuper"><img style="vertical-align:text-top;margin-left:5px;" src="../images/permalink.png" |
| alt="" /></a></h4> |
| <p>A role in a nested team may qualify the keyword <code>tsuper</code> (see <a href="#s1.3.1.f" title="§1.3.1.(f) tsuper" class="sect">§1.3.1.(f)</a> above) by a type name |
| in order to select among different implicit super classes. |
| A term <code>OuterTeam.tsuper</code> evaluates to a corresponding implicit super class |
| within the context of the explicit super-class (here: <code>SuperOuter</code>) of the enclosing team "<code>OuterTeam</code>". |
| A method call <code>OuterTeam.tsuper.m()</code> |
| evaluates to the method version within <code>SuperOuter</code> that best corresponds to the current method containing the tsuper-call. |
| |
| </p> |
| <div class="codecomment"> |
| <ul> |
| <li>In the above example (<a href="#l1.5" class="listing">Listing 1.5</a>) line 28 selects the method version |
| within the superclass of <code>RoleAndTeamSub</code> (i.e., within <code>RoleAndTeam</code>), |
| resolving to <code>OuterTeam.RoleAndTeam.InnerRole.foo()</code>. |
| </li> |
| <li>Line 29 selects a corresponding method from the context of <code>SuperOuter</code> resolving to <code>SuperOuter.RoleAndTeamSub.InnerRole.foo()</code> |
| which has the same semantics as an unqualified <code>tsuper</code> call would have. |
| |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="aux" id="aux1.1"> |
| <h4 class="aux">Language implementation:<span class="toplink"><a href="#s1">↑ §1</a></span></h4> |
| <p>Role acquisition and implicit inheritance can be implemented in at least two ways. |
| |
| </p> |
| <p><strong>Virtual classes:</strong> Each role class is an overridable feature of |
| its enclosing team. Role classes are resolved by dynamic binding |
| with respect to the enclosing team instance. This implementation |
| requires multiple-inheritance in order to also allow regular |
| inheritance between roles of the same team. <code>super</code> |
| and <code>tsuper</code> select parent versions of a method along |
| the two dimensions of inheritance. |
| |
| </p> |
| <p><strong>Copy inheritance:</strong> Role acquisition from a super-team has the effect |
| of copying a role definition <code>T.R</code> yielding a new |
| role <code>Tsub.R</code>. All role applications <code>Rx</code> |
| in the role copy refer to <code>Tsub.Rx</code>. Implicit role |
| inheritance extends a role copy in-place. Only the <code>tsuper</code> |
| construct allows to access the previous version of a method |
| (i.e. before in-place overriding). |
| |
| </p> |
| </div> |
| <div class="aux" id="aux1.2"> |
| <h4 class="aux">References:<span class="toplink"><a href="#s1">↑ §1</a></span></h4> |
| <p id="fn1-virtual-classes">[1] Ole Lehrmann Madsen and Birger Møller-Pedersen. <em>Virtual classes: A powerful mechanism in object-oriented programming</em>. In Proceedings OOPSLA 89, ACM SIGPLAN Notices, volume 24, 10, pages 397-406, October 1989. |
| |
| </p> |
| <p id="fn2-family-polymorphism">[2] Erik Ernst. <em>Family Polymorphism.</em> In Proceedings ECOOP 2001, LNCS 2072, pages 303-326, Springer, 2001. |
| |
| </p> |
| </div> |
| </div> |
| <table class="nav"> |
| <tr> |
| <td class="back"><a href="s0.html" rel="prev"><< §0 About this Document</a></td> |
| <td class="top"><a href="index.html" rel="contents">↑ Table of Contents ↑</a></td> |
| <td class="next"><a href="s2.html" rel="next">§2 Role Binding >></a></td> |
| </tr> |
| </table> |
| </div> |
| <div id="footer"> |
| <hr /><a class="w3c img" href="http://jigsaw.w3.org/css-validator/check/referer" |
| shape="rect"><img src="../images/valid-css2-blue.png" alt="Valid CSS!" height="31" width="88" /></a><a class="w3c img" href="http://validator.w3.org/check?uri=referer" shape="rect"><img src="../images/valid-xhtml10-blue.png" alt="Valid XHTML 1.0 Strict" height="31" |
| width="88" /></a><address>© Stephan Herrmann, Christine Hundt, Marco Mosconi</address> |
| OT/J version 1.3.1 — last modified: 2013-05-28 |
| </div> |
| </body> |
| </html> |