--dispatch expression Class C inherits A { manc5():Int{ { self.man4(23, true); self.mana1(); (new A).man(); --valid call self.man(); --valid call (new B).man5((new C)); } }; manc6():B{ (new B).man6(1) }; }; Class A inherits B{ m:Int; mana1():Int { (new B).man() --valid call...valid ret type }; mana2():Int { { m<-23; m<-(new B).man3(m); --valid call...valid ret type m<- self.man3(m); --valid call...valid ret type (new C).man5(self); } }; mana3():B { (new B).man6(1) --check for SELF_TYPE }; }; Class B { r:Int; s:Bool; man():Int { r<-1 }; man3(n:Int):Int { r<-n }; man4(n:Int, m:Bool):Bool { { r<-n; s<-m; } }; man5(n:B ):Int { r<-1 }; man6(n:Int ):SELF_TYPE { self }; }; class Main { main():Int { 1 }; };