http://d.puremagic.com/issues/show_bug.cgi?id=6857
--- Comment #56 from Don <clugd...@yahoo.com.au> 2012-05-06 00:36:04 PDT --- (In reply to comment #55) > Mea culpa. > > I read Meyer's book again. Chapter 16.1 "Cutting out the middleman" pg. 575 > says: > > "A client of MATRIX must satisfy the original (stronger) precondition, and may > only expect the original (weaker) postcondition; even if its request gets > served dynamically by NEW_MATRIX it has no way of benefiting from the broader > tolerance of inputs and tighter precision of results. To get this improved > specification it must declare the matric to be of type NEW_MATRIX, thereby > losing access to other implementations represented by descendants of MATRIX > that are not also descendants of NEW_MATRIX." > > (MATRIX is the base class, NEW_MATRIX is the derived class.) > > So I'm reopening it as a normal bug. > > Unfortunately, I do not currently see a reasonable way of implementing this. > Fortunately, as is it does not inhibit correct programs, it only accepts some > invalid ones. I think implementation is simpler than what happens at present. You need a static function thunk for each virtual function with a precondition. For example: class A { int foo(int n) in { assert(n >0); } body { return n; } } class B { int foo(int n) { return n+1; } // no change to precondition } class C { int foo(int n) in { assert(n > -10 && n<-6); } body { return n+2; } becomes (I've put 'virtual' in to make things clearer): class A { static void foo_in(A x) { assert(n>0); } virtual int foo(int n) { foo_in(this, n); return foo_body(n); } virtual int foo_body(int n) { return n; } } class B { virtual int foo_body(int n) { return n+1; } } class C { static void foo_in(C x, int n) { assert(n > -10 && n<-6); } virtual int foo(int n ) { if (C.foo_in(this, n)) return foo_body(n); // passed C's precondition return A.foo(n); // failed, try A's precondition } virtual int foo_body(int n) { return n+2; } } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------