---1077017559-1334841170-1116901694=:32617
Content-Type: MULTIPART/Mixed; BOUNDARY="-1077017559-1334841170-1116901694=:32617"

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

---1077017559-1334841170-1116901694=:32617
Content-Type: TEXT/PLAIN; CHARSET=ISO-8859-1; FORMAT=flowed
Content-Transfer-Encoding: QUOTED-PRINTABLE
Content-ID: <Pine.LNX.4.61.0505232316572.32617 / ns.artengine.ca>


Something weird happened to my last message while trying to send it, so=20
I'm sending it again, just in case. (and changing the topic too)

---------- Forwarded message ----------
Date: Mon, 23 May 2005 22:28:14 -0400 (EDT)
From: Mathieu Bouchard <matju / artengine.ca>
To: ruby-core / ruby-lang.org
Subject: Re: [ ruby-Patches-1939 ] Pathname, totally revamped


On Tue, 24 May 2005, Sam Roberts wrote:
> Sometimes called Liskov substitution principle.
>> never override any method in a subclass, because hey, people might not
>> expect different behavior.
> You derive to override implementation, not behaviour.

To be precise, what's normally called a "subtype" may have its apparent=20
behaviour be different from its "supertype" in a few ways. Let me try to=20
explain this in my own words.

The Liskov requirements (from my memory) are that IF the arguments and stat=
e=20
for the execution of a method are valid (preconditions), THEN the message=
=20
should have the expected effects and return values (postconditions). This i=
s a=20
logical implication, like this:

   Precond(method,pre_state,args) -> Postcond(method,post_state,return)

So you can do this in a subtype (relative to what it is in the supertype):

1. make the preconds looser
2. make the postconds stricter
3. make the postconds looser but only in the cases where the preconds are b=
eing=20
used in a looser way.

The point is that in a subtype, satisfying the Pre->Post implies satisfying=
 the=20
Pre->Post of the supertype. The above three cases are the three ways that=
=20
semantics can be extended without violating expectations.

So, in short, Liskov's substitution principle can be written:

   (SubPre -> SubPost) -> (SuperPre -> SuperPost)

again as a logical implication.

Does that sound accurate?

,-o--------o--------o--------o-. ,---. irc.freenode.net #dataflow |
| The Diagram is the Program tm| | ,-o-------------o--------------o-.
`-o------------o-------------o-' | | Mathieu Bouchard (Montr=E9al QC) |
   | t=E9l=E9phone:+1.514.383.3801`---' `-o-- http://artengine.ca/matju -'
---1077017559-1334841170-1116901694=:32617--
---1077017559-1334841170-1116901694=:32617--