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:06] – jorge | at:tutorial:objects [2007/07/02 13:34] – jorge | ||
---|---|---|---|
Line 49: | Line 49: | ||
Every object understands the message '' | Every object understands the message '' | ||
- | ===== Delegation and Dynamic Inheritance ===== | + | AmbientTalk |
- | AmbientTalk | + | |
- | The following code shows how to extend objects with a **IS-A** relationship. | + | < |
+ | > 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 relationship. We identify two kinds of delegation relationships: | ||
+ | |||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | The following code shows how to extend objects with a **IS-A** relationship. It uses the '' | ||
< | < | ||
> 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 |
} | } | ||
} | } | ||
</ | </ | ||
- | The following code shows how to extend objects with a **SHARE-A** relationship. | + | The following code shows how to extend objects with a **SHARE-A** relationship. It uses the '' |
< | < | ||
> 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 '' | ||
- | These relationships defines two different semantics for clonning child objects | + | < |
+ | > def openConnection := object: {...}; | ||
+ | def closedConnection := object: {...}; | ||
+ | def connection := object: { | ||
+ | def open() { | ||
+ | super := openConnection.new(); | ||
+ | }; | ||
+ | def close() { | ||
+ | super := closedConnection.new(); | ||
+ | }; | ||
+ | } | ||
+ | </ | ||
+ | ===== First-class delegation ===== | ||
+ | AmbientTalk provides an explicit delegation operator '' | ||
- | in the way | + | < |
+ | > 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 ===== | ||
+ | In AmbientTalk, | ||
- | . While both relationships | + | < |
+ | > def makeObject(hidden) { | ||
+ | object: { | ||
+ | def foo() { /* use hidden */ } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
- | | + | Due to the encapsulation of this object |
- | + | ||
- | + | ||
- | ===== Delegation and cloning ===== | + | |
- | + | ||
- | ===== First-class Delegation ===== | + | |
- | + | ||
- | ===== Encapsulation ===== | + | |
+ | < | ||
+ | > makeObject(5).hidden; | ||
+ | >> | ||
+ | < | ||
+ | </ |
at/tutorial/objects.txt · Last modified: 2013/05/17 20:23 by tvcutsem