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/07/10 12:46] – fixed tvcutsem | at:tutorial:objects [2007/07/18 14:51] – jorge | ||
---|---|---|---|
Line 94: | Line 94: | ||
def z := 0; | def z := 0; | ||
def sumOfSquares() { | def sumOfSquares() { | ||
- | super^sumOfSquares() + z*z | + | super^sumOfSquares() + z*z; |
}; | }; | ||
} | } | ||
Line 120: | Line 120: | ||
This cloning semantics reinforces the semantics of **IS-A** as promoting a unique link between a parent and a child object. **IS-A** delegation most closely corresponds to class-based inheritance. | This cloning semantics reinforces the semantics of **IS-A** as promoting a unique link between a parent and a child object. **IS-A** delegation most closely corresponds to class-based inheritance. | ||
- | ===== Delegation and dynamic inheritance | + | ===== Delegation and Dynamic Inheritance |
- | The parent of an object is bound to a field named '' | + | |
+ | In AmbientTalk, | ||
+ | |||
+ | Because '' | ||
< | < | ||
- | > def openConnection := object: {...}; | + | def openConnection := object: |
- | > def closedConnection := object: {...}; | + | def send(msg) |
- | > def connection := object: { | + | }; |
- | def open() { | + | def closedConnection := object: |
- | super := openConnection.new(); | + | def send(msg) |
+ | }; | ||
+ | def connection := object: | ||
+ | def init() | ||
+ | | ||
+ | }; | ||
+ | | ||
+ | super := openConnection; | ||
+ | }; | ||
+ | def close() { | ||
+ | super := closedConnection; | ||
+ | }; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | In the above example, the '' | ||
+ | |||
+ | < | ||
+ | In AmbientTalk, | ||
+ | </ | ||
+ | |||
+ | ===== First-class Delegation ===== | ||
+ | |||
+ | AmbientTalk provides a special message-sending operator '' | ||
+ | |||
+ | < | ||
+ | def Enumerable := object: { | ||
+ | def collect: closure { | ||
+ | def c := clone: self; | ||
+ | self.each: { |v| | ||
+ | c.add(closure(v)) | ||
}; | }; | ||
- | | + | }; |
- | | + | }; |
+ | def Array := object: { | ||
+ | def elements := []; | ||
+ | | ||
+ | def collect: closure { | ||
+ | Enumerable^collect: | ||
+ | }; | ||
+ | def each: clo { | ||
+ | 1.to: elements.length do: { |i| | ||
+ | clo(elements[i]) | ||
}; | }; | ||
- | } | + | }; |
+ | }; | ||
</ | </ | ||
- | <note important> | + | A message sent to an object using the '' |
- | In AmbientTalk, '' | + | |
- | </ | + | |
- | ===== First-class delegation ===== | + | Of course, the example above is a bit contrived: we could have just assigned |
- | AmbientTalk provides | + | |
+ | Having described | ||
< | < | ||
- | def point3D | + | def Point3D |
def z := 0; | def z := 0; | ||
def init(aX, aY, aZ) { | def init(aX, aY, aZ) { | ||
Line 150: | Line 192: | ||
z := aZ; | z := aZ; | ||
}; | }; | ||
- | } | + | }; |
</ | </ | ||
- | |||
- | A message sent to an object using the '' | ||
<note warning> | <note warning> | ||
- | The delegation operator | + | AmbientTalk, |
+ | |||
+ | Keep in mind, however, that '' | ||
</ | </ | ||
===== Encapsulation ===== | ===== Encapsulation ===== | ||
- | In AmbientTalk, all fields and methods are " | + | |
+ | AmbientTalk | ||
< | < | ||
- | > def makeObject(hidden) { | + | def makeBankAccount(balance) { |
- | object: { | + | object: { |
- | def foo() { /* use hidden */ } | + | def deposit(amnt) { |
- | } | + | balance := balance + amnt; |
+ | " | ||
+ | }; | ||
} | } | ||
+ | } | ||
</ | </ | ||
- | Due to the encapsulation of this object the following | + | Because |
< | < | ||
- | > makeObject(5).hidden; | + | > makeBankAccount(100).balance; |
- | >> | + | >> |
< | < | ||
</ | </ |
at/tutorial/objects.txt · Last modified: 2013/05/17 20:23 by tvcutsem