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/04 16:29] 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 the '' | ||
- | |||
- | <note important> | ||
- | The delegation operator does not have the same semantics as the dot notation. A message sent to '' | ||
- | </ | ||
- | |||
- | ===== 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; | ||
- | >> | ||
- | < | ||
- | </ |