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:28] – jorge | at:tutorial:objects [2007/07/02 13:29] – 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 }; | ||
} | } | ||
- | >>< | ||
</ | </ | ||
Line 24: | Line 23: | ||
<note important> | <note important> | ||
- | Note that AmbientTalk not only supports traditional canonical syntax (e.g. '' | + | AmbientTalk not only supports traditional canonical syntax (e.g. '' |
</ | </ | ||
- | In the example above, the state of the '' | + | 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 '' |
- | ===== Sending messages | + | ===== Cloning and instantiation |
- | In AmbientTalk, | + | As said before in this section, |
- | access to | + | < |
+ | > def anotherPoint := point.new(2, | ||
+ | </ | ||
- | access to the fields | + | Every object understands |
- | Object's fields and methods are accessed | + | AmbientTalk also provides a '' |
< | < | ||
- | > aPoint.x | + | > def clonedPoint := clone: point |
- | >>2 | + | |
- | > aPoint.sumOfSquares() | + | |
- | >>13 | + | |
</ | </ | ||
+ | ===== Delegation and cloning ===== | ||
+ | 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: | ||
- | ===== Cloning and instantiation ===== | + | {{: |
+ | The following code shows how to extend objects with a **IS-A** relationship. It uses the '' | ||
- | ===== Delegation and Dynamic Inheritance ===== | + | < |
+ | > def point3D := extend: point with: { | ||
+ | def z := 0; | ||
+ | def sumofsquares() { | ||
+ | super.sumofsquares() + z*z | ||
+ | } | ||
+ | } | ||
+ | </ | ||
- | ===== Delegation and cloning ===== | + | The following code shows how to extend objects with a **SHARE-A** relationship. It uses the '' |
- | ===== First-class | + | < |
+ | > def point3D := share: point with: { | ||
+ | def z := 0; | ||
+ | def sumofsquares() { | ||
+ | super.sumofsquares() + z*z | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Delegation and dynamic inheritance ===== | ||
+ | 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(); | ||
+ | }; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== First-class | ||
+ | AmbientTalk provides an explicit delegation operator '' | ||
+ | |||
+ | < | ||
+ | > def point3D := extend: point with: { | ||
+ | def z := 0; | ||
+ | def init(aX, aY, aZ) { | ||
+ | super^init(aX, | ||
+ | z := aZ; | ||
+ | }; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 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