This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
at:tutorial:objects [2007/07/02 13:47] jorge |
at:tutorial:objects [2013/05/17 20:23] tvcutsem updated |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | In this section, we explain how the object-oriented programming paradigm is implemented in AmbientTalk. | ||
- | ===== Objects, fields and methods ===== | ||
- | In AmbientTalk, | ||
- | classes. Rather, they are either created ex-nihilo or by cloning | ||
- | and adapting existing objects, like prototypes in the SELF programming language. The definition of such a prototypical object contains a number of fields and methods that represent the object' | ||
- | |||
- | The following code illustrates the ex-nihilo creation of an object: | ||
- | |||
- | < | ||
- | > def point := object: { | ||
- | def x := 0; | ||
- | def y := 0; | ||
- | def init(aX,aY) { | ||
- | x := aX; | ||
- | y := aY; | ||
- | }; | ||
- | def sumOfSquares() { x*x + y*y }; | ||
- | } | ||
- | </ | ||
- | |||
- | As all definitions in AmbientTalk, | ||
- | |||
- | <note important> | ||
- | AmbientTalk not only supports traditional canonical syntax (e.g. '' | ||
- | </ | ||
- | |||
- | In the example above, the state of the '' | ||
- | |||
- | ===== Sending messages ===== | ||
- | In AmbientTalk, | ||
- | |||
- | < | ||
- | > point.x | ||
- | >>2 | ||
- | > point.sumOfSquares() | ||
- | >>13 | ||
- | </ | ||
- | |||
- | This code shows two messages sent to the '' | ||
- | |||
- | ===== Cloning and instantiation ===== | ||
- | As said before in this section, AmbientTalk objects are created [[objects# | ||
- | |||
- | < | ||
- | > def anotherPoint := point.new(2, | ||
- | </ | ||
- | |||
- | Every object understands the message '' | ||
- | |||
- | AmbientTalk also provides a '' | ||
- | |||
- | < | ||
- | > 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 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(); | ||
- | }; | ||
- | } | ||
- | </ | ||
- | |||
- | <note important> | ||
- | In AmbientTalk, | ||
- | </ | ||
- | |||
- | ===== First-class delegation ===== | ||
- | 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 ===== | ||
- | In AmbientTalk, | ||
- | |||
- | < | ||
- | > def makeObject(hidden) { | ||
- | object: { | ||
- | def foo() { /* use hidden */ } | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | Due to the encapsulation of this object the following instruction fails: | ||
- | |||
- | < | ||
- | > makeObject(5).hidden; | ||
- | >> | ||
- | < | ||
- | </ |