////////// Exercice _1_ ////////// ////////// Exercice _2_ ////////// let o = object (self) val mutable x = 0 (* Attribute *) method get = x (* Method *) method move d = x <- x + d end;; o#get;; (* -> 0 *) o#move 2;; (* -> unit *) o#get;; (* -> 2 *) class point = fun init -> object (self) val mutable x = init method get = x method move d = x <- x + d end;; let o = new point 3;; ////////// Exercice _3_ ////////// // First class hierarchy A <- B <- C <- D class A {} class B extends A {} class C extends B {} class D extends C {} // Second class hierarchy W <- X <- Y <- Z class W { void foo(D d) {System.out.println("W.D");} } class X extends W { void foo(A a) {System.out.println("X.A");} void foo(B b) {System.out.println("X.B");} } class Y extends X { void foo(B b) {System.out.println("Y.B");} } class Z extends Y { void foo(C c) {System.out.println("Z.C");} } // Main program public class CallSelection { public static void main(String [] argv) { Z z = new Z(); ((X) z).foo(new C()); } } // Small class hierarchy A <- B class A {} class B extends A {} // Examples of ambiguous calls class AmbiguousCall { void foo(B b, double x){} void foo(A a, int i){} void doit() { foo(new A(), 8); // Matches foo(A, int) foo(new A(), 8.0); // Error: doesn't match anything foo(new B(), 8); // Error: ambiguous, matches both foo(new B(), 8.0); // Matches foo(B, double) } }