+ All Categories
Home > Documents > Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object...

Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object...

Date post: 16-Oct-2020
Category:
Upload: others
View: 1 times
Download: 0 times
Share this document with a friend
60
Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University of Wellington {tim,mwh,kjx}@ecs.vuw.ac.nz Kim Bruce Pomona College [email protected] July 21, 2016
Transcript
Page 1: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance Without Classes

Timothy Jones, Michael Homer, James NobleVictoria University of Wellington{tim,mwh,kjx}@ecs.vuw.ac.nz

Kim BrucePomona College

[email protected]

July 21, 2016

Page 2: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Foundations

Objects v Classes

Andrew v Kim

Objects-first v Objectdraw

1

Page 3: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Foundations

Objects v Classes

Andrew v Kim

Objects-first v Objectdraw

1

Page 4: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Foundations

Objects v Classes

Andrew v Kim

Objects-first v Objectdraw

1

Page 5: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Foundations

Know Thy Self

This problem is solved!

( | parent* = other. | )

( | parent* = factory new. | )

2

Page 6: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Foundations

Know Thy Self

This problem is solved!

( | parent* = other. | )

( | parent* = factory new. | )

2

Page 7: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Foundations

Know Thy Self

This problem was supposed to be solved. . .

( | parent* = other. | )

( | parent* = factory new. | )

2

Page 8: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Semantics

Object Inheritance

method graphic(canvas) {object {

. . .}

}

def amelia = object {inherit graphic(canvas). . .

}

3

Page 9: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Semantics

Semantics

What does this mean?

inherit graphic(canvas)

Do the inherit semantics actually allow us to implement classes?

I Let’s investigate different object inheritance semanticses

4

Page 10: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Semantics

Semantics

5

Page 11: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Semantics

Semantics

6

Page 12: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Semantics

Semantics

7

Page 13: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Semantics

Semantics

8

Page 14: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Semantics

Semantics

9

Page 15: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Semantics

Implementation

Runnable semantics with PLT Redex

https://github.com/zmthy/graceless-redex

10

Page 16: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Semantics

Reg. Down. Dist. Stable Exist. Mult.ForwardingDelegationConcatenationMergedUniformMult. UniformTransform U.Positional U.Java yes yes no yes class no

(* indicates true for construction, then reversed afterwards)

11

Page 17: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

Object Inheritance

Objects inherit directly from one another

Three foundational models:

I Forwarding (as in E)

I Delegation (as in JavaScript and Self)

I Concatenation (as in Kevo)

12

Page 18: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

Forwarding

Requests to inherited methods go directly to inherited object

I Simplest semantics

amethod m(x)

b

m(v)

m(v)

No down-calls (cannot modify existing implementation)

13

Page 19: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

Forwarding

Requests to inherited methods go directly to inherited object

I Simplest semantics

amethod m(x)

bm(v)

m(v)

No down-calls (cannot modify existing implementation)

13

Page 20: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

Forwarding

Requests to inherited methods go directly to inherited object

I Simplest semantics

amethod m(x)

bm(v)

m(v)

No down-calls (cannot modify existing implementation)

13

Page 21: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

Forwarding

Requests to inherited methods go directly to inherited object

I Simplest semantics

amethod m(x)

bm(v)

m(v)

No down-calls (cannot modify existing implementation)

13

Page 22: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

Down-calls

method graphic(canvas) {object {

method image { abstract }method draw {

canvas.render( image )}

}}

def amelia = object {inherit graphic(canvas)def image = images.amelia

}

14

Page 23: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

DelegationRequests to inherited methods have self bound to original object

I The standard semantics of object inheritance

amethod m(x){ self.k(x) }

b

m(v)

m(v)k(v)

Vampire problem

Surprising behaviour if you’re used to classes

15

Page 24: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

DelegationRequests to inherited methods have self bound to original object

I The standard semantics of object inheritance

amethod m(x){ self.k(x) }

b

m(v)

m(v)k(v)

Vampire problem

Surprising behaviour if you’re used to classes

15

Page 25: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

DelegationRequests to inherited methods have self bound to original object

I The standard semantics of object inheritance

amethod m(x){ self.k(x) }

b

m(v)

m(v)

k(v)

Vampire problem

Surprising behaviour if you’re used to classes

15

Page 26: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

DelegationRequests to inherited methods have self bound to original object

I The standard semantics of object inheritance

amethod m(x){ self.k(x) }

b

m(v)

m(v)k(v)

Vampire problem

Surprising behaviour if you’re used to classes

15

Page 27: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

DelegationRequests to inherited methods have self bound to original object

I The standard semantics of object inheritance

amethod m(x){ self.k(x) }

b

m(v)

m(v)k(v)

Vampire problem

Surprising behaviour if you’re used to classes

15

Page 28: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

DelegationRequests to inherited methods have self bound to original object

I The standard semantics of object inheritance

amethod m(x){ self.k(x) }

b

m(v)

m(v)k(v)

Vampire problem

Surprising behaviour if you’re used to classes15

Page 29: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

Action at a Distance

method graphic(canvas) {object {

var name := "A graphic"}

}

def parent = graphic(canvas)

def amelia = object {inherit parentname := "Amelia"

}

16

Page 30: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

Delegation (as in Self)above = (|

value ← 3.run = (|| say).say = (|| ’above’ printLine)

|).

below = (|parent* = above.say = (|| ’below’ printLine)

|run.value: 5).

other = (|parent* = above.

| value print).

17

Page 31: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

Concatenation

Copy the methods and fields from the inherited object

I Removes direct relationship between inheritor and inheritee

amethod m(x)

method k(y)

Changes to inherited object are not reflected in inheriting object

18

Page 32: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

Concatenation

Copy the methods and fields from the inherited object

I Removes direct relationship between inheritor and inheritee

amethod m(x)

bmethod m(x); method k(y)

Changes to inherited object are not reflected in inheriting object

18

Page 33: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

Concatenation

Copy the methods and fields from the inherited object

I Removes direct relationship between inheritor and inheritee

amethod m(x)

bmethod m(x); method k(y)

Changes to inherited object are not reflected in inheriting object

18

Page 34: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Object Inheritance

Registration

method graphic(canvas) {object {

canvas.register( self )}

}

def amelia = object {inherit graphic(canvas)

}

19

Page 35: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Emulating Classes

Emulating Classes

Objects inherit from calls to constructor methods

Two class-like models

I Merged Identity (as in C++)

I Uniform Identity (as in Java)

Cannot inherit from preëxisting objects

20

Page 36: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Emulating Classes

Merged Identity

Inheriting object ‘becomes’ the inherited object

I Registered identities eventually resolve to the intended object

amethod m(x)

method k(y)

amethod m(x); method k(y)

Body-snatchers problem

Objects not stable during construction

21

Page 37: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Emulating Classes

Merged Identity

Inheriting object ‘becomes’ the inherited object

I Registered identities eventually resolve to the intended object

amethod m(x)

method k(y)

amethod m(x); method k(y)

Body-snatchers problem

Objects not stable during construction

21

Page 38: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Emulating Classes

Merged Identity

Inheriting object ‘becomes’ the inherited object

I Registered identities eventually resolve to the intended object

amethod m(x)

method k(y)

amethod m(x); method k(y)

Body-snatchers problem

Objects not stable during construction

21

Page 39: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Emulating Classes

Merged Identity

Inheriting object ‘becomes’ the inherited object

I Registered identities eventually resolve to the intended object

amethod m(x)

method k(y)

amethod m(x); method k(y)

Body-snatchers problem

Objects not stable during construction

21

Page 40: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Emulating Classes

Stability

method graphic(canvas) {object {

image

method image { abstract }}

}

def amelia = object {inherit graphic(canvas)def image = images.amelia

}

22

Page 41: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Emulating Classes

Uniform Identity

Inherited initialisation code runs as the inheriting object

I Basically magic

method m(x)

bmethod k(y)

Uninitialised state during construction

23

Page 42: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Emulating Classes

Uniform Identity

Inherited initialisation code runs as the inheriting object

I Basically magic

method m(x)

bmethod m(x); method k(y)

Uninitialised state during construction

23

Page 43: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Emulating Classes

Uniform Identity

Inherited initialisation code runs as the inheriting object

I Basically magic

method m(x)

bmethod m(x); method k(y)

Uninitialised state during construction

23

Page 44: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Emulating Classes

Uniform Identity

Inherited initialisation code runs as the inheriting object

I Basically magic

method m(x)

bmethod m(x); method k(y)

Uninitialised state during construction

23

Page 45: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Emulating Classes

Emulating Classes

Not very satisfactory as foundational models

I No inheritance from preëxisting objects

Other languages (JavaScript, E) achieve this using other features

24

Page 46: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Emulating Classes

Emulating Classes

Not very satisfactory as foundational models

I No inheritance from preëxisting objects

Other languages (JavaScript, E) achieve this using other features

24

Page 47: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Emulating Classes

Classes in JavaScriptfunction Above() {

this.value = 3;this.say();

}

Above.prototype.run = function () { this.say(); };

function Below() { Above.call(this); }

Below.prototype.say = function () { console.log("hello"); };

new Below().run();25

Page 48: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Emulating Classes

Classes in E

def makeAbove(self) {def above { to run() { self.say() } }self ← say()return above

}

def below extends makeAbove(below) {to say() { println("hello") }

}

below.run()

26

Page 49: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Conclusion

Multiple Inheritance

Every model except merged identity

Various different conflict resolution schemes

I Named supers

I Method transformations

I Positional inheritance

27

Page 50: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Conclusion

Reg. Down. Dist. Stable Exist. Mult.Forwarding no no yes yes yes canDelegation no no* yes no yes canConcatenation no no* no no yes canMerged yes no* no no* fresh can’tUniform yes yes no yes fresh noMult. Uniform yes yes no yes fresh yesTransform U. yes yes no no fresh yesPositional U. yes yes no no fresh yesJava yes yes no yes class no

(* indicates true for construction, then reversed afterwards)

28

Page 51: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Conclusion

Reg. Down. Dist. Stable Exist. Mult.Forwarding no no yes yes yes canDelegation no no* yes no yes canConcatenation no no* no no yes canMerged yes no* no no* fresh can’tUniform yes yes no yes fresh noMult. Uniform yes yes no yes fresh yesTransform U. yes yes no no fresh yesPositional U. yes yes no no fresh yesJava yes yes no yes class no

(* indicates true for construction, then reversed afterwards)

29

Page 52: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Conclusion

Conclusion

No obviously superior semantics for object inheritance

Emulating classes requires magic or complicated language features

Ultimately depends on the design goals for the language

30

Page 53: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Conclusion

Lessons

OO language designers

I Simple foundations do not imply simple design

Everyone else

I Problems are hidden in solved designs

31

Page 54: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Conclusion

Lessons

OO language designers

I Simple foundations do not imply simple design

Everyone else

I Problems are hidden in solved designs

31

Page 55: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Extra Slides

Semantics

32

Page 56: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Extra Slides

Forwarding (as in E)

def above {to run() {

above.say()}

to say() {println("above")

}}

33

Page 57: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Extra Slides

Forwarding (as in E)

def above {to run() {

above.say()}

to say() {println("above")

}}

def below extends above {to say() {

println("below")}

}

below.run()

33

Page 58: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Extra Slides

Delegation (as in Self)

above = (|value ← 3.run = (|| say).say = (|| ’above’ printLine)

|).

below = (|parent* = above.say = (|| ’below’ printLine)

| run).

34

Page 59: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Extra Slides

Delegation (as in Self)

above = (|value ← 3.run = (|| say).say = (|| ’above’ printLine)

|).

below = (|parent* = above.say = (|| ’below’ printLine)

| value: 5).

other = (|parent* = above.

| value print).

34

Page 60: Object Inheritance Without Classeshomepages.ecs.vuw.ac.nz/~tim/...inheritance-slides.pdf · Object Inheritance Without Classes Timothy Jones, Michael Homer, James Noble Victoria University

Extra Slides

Delegation (as in JavaScript-ish)

let above = {};above.value = 3;above.run = function () { this.say(); };above.say = function () { console.log("above"); };

let below = Object.create(above);below.say = function () { console.log("below"); };below.value = 5;

below.run();console.log(above.value 6= below.value);

35


Recommended