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/29 13:19] – jorge | at:tutorial:objects [2007/07/09 21:03] – * tvcutsem | ||
---|---|---|---|
Line 4: | Line 4: | ||
In AmbientTalk, | In AmbientTalk, | ||
classes. Rather, they are either created ex-nihilo or by cloning | classes. Rather, they are either created ex-nihilo or by cloning | ||
- | and adapting existing objects, | + | and adapting existing objects, |
The following code illustrates the ex-nihilo creation of an object: | The following code illustrates the ex-nihilo creation of an object: | ||
< | < | ||
- | > def point := object: { | + | def Point := object: { |
- | def x := 0; | + | def x := 0; |
- | def y := 0; | + | def y := 0; |
- | def init(aX,aY) { | + | def init(aX,aY) { |
- | x := aX; | + | x := aX; |
- | y := aY; | + | y := aY; |
- | }; | + | }; |
- | def sumOfSquares() { x*x + y*y }; | + | def sumOfSquares() { x*x + y*y }; |
- | } | + | } |
</ | </ | ||
- | As all definitions in AmbientTalk, objects, fields and methods are defined using the **def** keyword. Fields are defined using a '' | + | The above code defines an // |
- | <note important> | + | In the example above, the state of the point object is composed of '' |
- | AmbientTalk not only supports traditional canonical syntax (e.g. '' | + | |
- | </ | + | |
- | In the example above, the state of the '' | + | < |
+ | As already explained in the [[at: | ||
+ | |||
+ | For Smalltalk/ | ||
+ | </ | ||
===== Sending messages ===== | ===== Sending messages ===== | ||
Line 32: | Line 34: | ||
< | < | ||
- | > point.x | + | > Point.x |
- | >>2 | + | >>0 |
- | > point.sumOfSquares() | + | > Point.sumOfSquares() |
- | >>13 | + | >>0 |
</ | </ | ||
- | This code shows two messages sent to the '' | + | This code shows two messages sent to the point object defined above. The '' |
+ | |||
+ | Note that the " | ||
===== Cloning and instantiation ===== | ===== Cloning and instantiation ===== | ||
Line 49: | Line 53: | ||
Every object understands the message '' | Every object understands the message '' | ||
- | ===== Delegation and Dynamic Inheritance | + | AmbientTalk also provides a '' |
- | AmbientTalk features object inheritance or delegation. By means of delegation, an object can reuse and extend the defintion of another establishing a child-parent relationship. We identify two kinds of delegation relationships: | + | |
- | These relationships | + | < |
+ | > def clonedPoint := clone: point | ||
+ | </ | ||
+ | |||
+ | ===== 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 | ||
+ | |||
+ | |||
+ | {{: | ||
The following code shows how to extend objects with a **IS-A** relationship. It uses the '' | The following code shows how to extend objects with a **IS-A** relationship. It uses the '' | ||
Line 58: | Line 71: | ||
> def point3D := extend: point with: { | > def point3D := extend: point with: { | ||
def z := 0; | def z := 0; | ||
- | def sumofsquares() { | + | def sumOfSquares() { |
- | super.sumofsquares() + z*z | + | super^sumOfSquares() + z*z |
} | } | ||
} | } | ||
Line 69: | Line 82: | ||
> def point3D := share: point with: { | > def point3D := share: point with: { | ||
def z := 0; | def z := 0; | ||
- | def sumofsquares() { | + | def sumOfSquares() { |
- | super.sumofsquares() + z*z | + | super^sumOfSquares() + z*z |
} | } | ||
} | } | ||
</ | </ | ||
+ | ===== Delegation and dynamic inheritance ===== | ||
+ | The parent of an object is bound to a field named '' | ||
- | ===== Delegation and cloning ===== | + | < |
+ | > def openConnection := object: {...}; | ||
+ | > def closedConnection := object: {...}; | ||
+ | > def connection := object: { | ||
+ | def open() { | ||
+ | super := openConnection.new(); | ||
+ | }; | ||
+ | def close() { | ||
+ | super := closedConnection.new(); | ||
+ | }; | ||
+ | } | ||
+ | </ | ||
- | ===== First-class | + | <note important> |
+ | In AmbientTalk, | ||
+ | </ | ||
+ | |||
+ | ===== 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 the '' | ||
+ | |||
+ | <note warning> | ||
+ | The delegation operator does not have the same semantics as the dot notation. A message sent to '' | ||
+ | </ | ||
===== 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