SE701:March 14: Difference between revisions
Jump to navigation
Jump to search
m 1 revision(s) |
(No difference)
|
Latest revision as of 05:27, 3 November 2008
Generic functions and multiple dispatch
Java has "single dispatch"
class DispatchDemo {
static class A {
void foo( B b ) {
System.out.println( "foo called on A B" );
}
void foo( SubB b ) {
System.out.println( "foo called on A SUB-B" );
}
}
static class SubA extends A {
void foo( B b ) {
System.out.println( "foo called on SUB-A B" );
}
void foo( SubB b ) {
System.out.println( "foo called on SUB-A SUB-B" );
}
}
static class B { }
static class SubB extends B { }
static public void main( String[] args ) {
A just_a = new A( );
B just_b = new B( );
A sub_a = new SubA( );
B sub_b = new SubB( );
just_a.foo( just_b );
just_a.foo( sub_b );
sub_a.foo( just_b );
sub_a.foo( sub_b );
}
}
CommonLisp has multiple dispatch
(defclass a () ()) (defclass sub-a (a) ()) (defclass b () ()) (defclass sub-b (b) ()) (defgeneric foo (a b)) (defmethod foo ((x a) (y b)) (format nil "foo called on A and B~%")) (defmethod foo ((x sub-a) (y b)) (format nil "foo called on SUB-A and B~%")) (defmethod foo ((x a) (y sub-b)) (format nil "foo called on A and SUB-B~%")) (defmethod foo ((x sub-a) (y sub-b)) (format nil "foo called on SUB-A and SUB-B~%")) (defparameter *just-a* (make-instance 'a)) (defparameter *just-b* (make-instance 'b)) (defparameter *sub-a* (make-instance 'sub-a)) (defparameter *sub-b* (make-instance 'sub-b)))