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 12:11] – jorge | at:tutorial:objects [2007/07/02 13:32] – 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, |
- | This object can be instantiated to create new points as follows: | + | |
- | <code> | + | <note important> |
- | > def initialPoint := Point.new(0,0) | + | AmbientTalk not only supports traditional canonical syntax (e.g. '' |
- | >>< | + | </note> |
- | </code> | + | |
- | Every object understands | + | In the example above, the state of the '' |
===== Sending messages ===== | ===== Sending messages ===== | ||
- | In AmbientTalk, | + | In AmbientTalk, |
+ | |||
+ | < | ||
+ | > point.x | ||
+ | >>2 | ||
+ | > point.sumOfSquares() | ||
+ | >> | ||
+ | </ | ||
+ | |||
+ | This code shows two messages sent to the '' | ||
===== Cloning and instantiation ===== | ===== Cloning and instantiation ===== | ||
+ | As said before in this section, AmbientTalk objects are created [[objects# | ||
+ | < | ||
+ | > def anotherPoint := point.new(2, | ||
+ | </ | ||
+ | Every object understands the message '' | ||
- | ===== Delegation | + | AmbientTalk also provides a '' |
+ | |||
+ | < | ||
+ | > def clonedPoint := clone: point | ||
+ | </ | ||
===== Delegation and cloning ===== | ===== 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: | ||
- | ===== First-class | + | |
+ | {{: | ||
+ | |||
+ | |||
+ | The following code shows how to extend objects with a **IS-A** relationship. It uses the '' | ||
+ | |||
+ | < | ||
+ | > def point3D := extend: point with: { | ||
+ | def z := 0; | ||
+ | def sumofsquares() { | ||
+ | super^sumofsquares() + z*z | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 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 | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== 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