In a message dated Fri, 25 Aug 2006, Mark J. Reed writes:
I think the justification for Luke's POV is the number of operations
each class provides. But my perspective agrees with Juerd -
subclasses can remove functionality as well as adding it, and I
definitely view "constant" as an add-on modifier, not a default that
has to be overridden.
Can someone suggest some reading I can do to understand how that works?
I can't wrap my head around the idea of subclasses removing functionality.
Does this mean you can't write
class Super { method something { ... } }
sub foo (Super $bar) { $bar.something() }
and expect foo($obj) to work, because $obj might be:
class Sub is Super { # remove .something--how does that happen? }
foo($obj); # Boom!?
So what happens? Do you arrange somehow for polymorphism to be
interrupted, so that the call to foo() acts as though there was a
nonconformant type? Does foo() get scanned somehow to notice that
.something() is getting called, and $obj doesn't support .something, so
that bubbles up such that foo() can't be called in the first place? (If
that's true, how do you do duck-typing, since duck-typing code almost by
definition has branches that would call such invalid methods?)
I had been toying with writing some tests for the DBC blocks. But the
idea of removing functionality from a subclass completely blows away my
understanding of DBC, so I'd particularly like some reading to help me
understand how DBC works in a language that lets you remove functionality.
Trey