at:tutorial:objects
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
at:tutorial:objects [2007/06/27 14:24] – jorge | at:tutorial:objects [2007/07/02 13:44] – jorge | ||
---|---|---|---|
Line 9: | Line 9: | ||
< | < | ||
- | > def Point := object: { | + | > def point := object: { |
def x := 0; | def x := 0; | ||
def y := 0; | def y := 0; | ||
- | def init(xCoord,yCoord) { | + | def init(aX,aY) { |
- | x := xCoord; | + | x := aX; |
- | y := yCoord; | + | y := aY; |
}; | }; | ||
def sumOfSquares() { x*x + y*y }; | def sumOfSquares() { x*x + y*y }; | ||
} | } | ||
- | >>< | ||
</ | </ | ||
- | As all definitions in AmbientTalk, | + | As all definitions in AmbientTalk, |
+ | |||
+ | <note important> | ||
+ | AmbientTalk not only supports traditional canonical syntax (e.g. '' | ||
+ | </ | ||
+ | |||
+ | In the example above, the state of the '' | ||
+ | |||
+ | ===== Sending messages ===== | ||
+ | In AmbientTalk, | ||
< | < | ||
- | > def aPoint := Point.new(2,3) | + | > point.x |
- | >>< | + | >>2 |
+ | > point.sumOfSquares() | ||
+ | >>13 | ||
</ | </ | ||
- | Every object understands | + | This code shows two messages sent to the '' |
- | <note important> | + | ===== Cloning and instantiation ===== |
- | AmbientTalk | + | As said before in this section, |
- | </ | + | |
- | ===== Sending messages ===== | + | < |
- | In AmbientTalk, | + | > def anotherPoint := point.new(2, |
+ | </ | ||
- | access | + | Every object understands the message '' |
- | access to the fields and methods | + | AmbientTalk also provides a '' |
- | Object' | + | < |
+ | > def clonedPoint := clone: point | ||
+ | </ | ||
+ | |||
+ | ===== Delegation | ||
+ | AmbientTalk features object inheritance or delegation. By means of delegation, an object can reuse and extend the defintion of another establishing a parent-child relationship. We identify two kinds of delegation relationships: **IS-A** and **SHARE-A**. These relationships define two different semantics for clonning child objects. Whereas clonning a **IS-A** child also clones its parent, **SHARE-A** child shares the parent of the cloned object (see the figure below). | ||
+ | |||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | The following code shows how to extend objects with a **IS-A** relationship. It uses the '' | ||
< | < | ||
- | > aPoint.x | + | > def point3D := extend: point with: { |
- | >>2 | + | def z := 0; |
- | > aPoint.sumOfSquares() | + | |
- | >>13 | + | |
+ | } | ||
+ | } | ||
</ | </ | ||
+ | The following code shows how to extend objects with a **SHARE-A** relationship. It uses the '' | ||
+ | < | ||
+ | > def point3D := share: point with: { | ||
+ | def z := 0; | ||
+ | def sumOfSquares() { | ||
+ | super^sumOfSquares() + z*z | ||
+ | } | ||
+ | } | ||
+ | </ | ||
- | ===== Cloning | + | ===== Delegation |
+ | The parent of an object is bound to a field named '' | ||
+ | < | ||
+ | > def openConnection := object: {...}; | ||
+ | > def closedConnection := object: {...}; | ||
+ | > def connection := object: { | ||
+ | def open() { | ||
+ | super := openConnection.new(); | ||
+ | }; | ||
+ | def close() { | ||
+ | super := closedConnection.new(); | ||
+ | }; | ||
+ | } | ||
+ | </ | ||
+ | <note important> | ||
+ | In AmbientTalk, | ||
+ | </ | ||
- | ===== Delegation and Dynamic Inheritance | + | ===== First-class delegation |
+ | AmbientTalk provides an explicit delegation operator '' | ||
- | ===== Delegation and cloning ===== | + | < |
+ | > def point3D := extend: point with: { | ||
+ | def z := 0; | ||
+ | def init(aX, aY, aZ) { | ||
+ | super^init(aX, | ||
+ | z := aZ; | ||
+ | }; | ||
+ | } | ||
+ | </ | ||
- | ===== First-class Delegation ===== | + | A message sent to an object using this symbol (e.g. to the parent object in the example above) will first look for the method that matches the selector indicated in the message in this object (and its parents) and then execute the method body in the lexical scope of the message sender. |
===== Encapsulation ===== | ===== Encapsulation ===== | ||
+ | In AmbientTalk, | ||
+ | < | ||
+ | > def makeObject(hidden) { | ||
+ | object: { | ||
+ | def foo() { /* use hidden */ } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Due to the encapsulation of this object the following instruction fails: | ||
+ | |||
+ | < | ||
+ | > makeObject(5).hidden; | ||
+ | >> | ||
+ | < | ||
+ | </ |
at/tutorial/objects.txt · Last modified: 2013/05/17 20:23 by tvcutsem