Forget / Keep Mechanism: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| Line 3: | Line 3: | ||
===Example=== | ===Example=== | ||
{| class="top-aligned" | |||
| | |||
<e> | <e> | ||
class ANIMAL | class ANIMAL | ||
| Line 12: | Line 14: | ||
end | end | ||
</e> | </e> | ||
| | |||
<e> | <e> | ||
class CAT | class CAT | ||
| Line 29: | Line 31: | ||
end | end | ||
</e> | </e> | ||
| | |||
<e> | |||
class FOOD | |||
end | |||
class CAT_FOOD | |||
cat-call | inherit | ||
FOOD | |||
end | |||
</e> | |||
|} | |||
===cat-call=== | |||
<e> | <e> | ||
| Line 44: | Line 60: | ||
</e> | </e> | ||
forget-mechanism | ===forget-mechanism=== | ||
Types which have covariant redefined features will not be conform. | Types which have covariant redefined features will not be conform. A feature which is covariantly redefined changes its inherit clause implicitly to inherit from a parent class which has the redefined feature in a forget clause. | ||
{| class=" | {| class="top-aligned" | ||
|- | |- | ||
! what you write | |||
! what is implied | |||
|- | |- | ||
| | | | ||
| Line 64: | Line 80: | ||
end | end | ||
feature | |||
eat (f: CAT_FOOD) | |||
end | |||
</e> | </e> | ||
| | | | ||
| Line 79: | Line 99: | ||
end | end | ||
feature | |||
eat (f: CAT_FOOD) | |||
end | |||
</e> | </e> | ||
|} | |} | ||
The conformance between <e>ANIMAL</e> and <e>ANIMAL forget eat</e> and <e>ANIMAL forget all</e> is as follows: | |||
<e> | <e> | ||
local | local | ||
normal_animal: ANIMAL | normal_animal: ANIMAL | ||
forget_eat_animal: ANIMAL forget eat end | |||
forget_all_animal: ANIMAL forget all end | |||
do | do | ||
-- this assignment is legal | -- this assignment is legal since all features present in the | ||
-- forget types are also present in the normal type | |||
forget_eat_animal := normal_animal | |||
forget_all_animal := normal_animal | |||
-- this assignment is illegal since the forget_animal lacks | -- this assignment is illegal since the forget_animal lacks | ||
-- the eat feature and thus cannot be used as an ANIMAL | -- the eat feature and thus cannot be used as an ANIMAL | ||
normal_animal := | normal_animal := forget_eat_animal | ||
normal_animal := forget_all_animal | |||
-- this assignment is legal since the forget all type | |||
-- has fewer or equal features than the forget eat type | |||
forget_all_animal := forget_eat_animal | |||
-- this assignment is only legal if only the feature `eat' | |||
-- is covariantly redefined in the type ANIMAL and thus | |||
-- forget eat is equivalent to forget all | |||
forget_eat_animal := forget_all_animal | |||
end | end | ||
</e> | </e> | ||
Now the cat-call example: | Now the cat-call example with the new forget types: | ||
<e> | <e> | ||
| Line 107: | Line 145: | ||
do | do | ||
-- illegal assignment, ANIMAL and CAT don't conform | -- illegal assignment, ANIMAL and CAT don't conform | ||
-- since CAT inherits from ANIMAL forget eat | -- since CAT implicitly inherits from ANIMAL forget eat | ||
a := c | a := c | ||
a.eat (food) | a.eat (food) | ||
end | end | ||
</e> | </e> | ||
| Line 120: | Line 159: | ||
-- legal, CAT conforms to ANIMAL forget all | -- legal, CAT conforms to ANIMAL forget all | ||
a := c | a := c | ||
-- illegal, ANIMAL forget all doesn't have a feature eat | -- illegal, ANIMAL forget all doesn't have a feature eat | ||
a.eat (food) | a.eat (food) | ||
end | end | ||
</e> | </e> | ||
Revision as of 00:39, 20 February 2007
Warning: Warning: Article under development
Example
class ANIMAL feature eat (f: FOOD) end |
class CAT inherit ANIMAL redefine eat end feature eat (f: CAT_FOOD) end |
class FOOD end class CAT_FOOD inherit FOOD end |
cat-call
local a: ANIMAL c: CAT do a := c a.eat (food) end
forget-mechanism
Types which have covariant redefined features will not be conform. A feature which is covariantly redefined changes its inherit clause implicitly to inherit from a parent class which has the redefined feature in a forget clause.
| what you write | what is implied |
|---|---|
class CAT inherit ANIMAL redefine eat end feature eat (f: CAT_FOOD) end |
class CAT inherit ANIMAL forget eat redefine eat end feature eat (f: CAT_FOOD) end |
The conformance between ANIMAL and ANIMAL forget eat and ANIMAL forget all is as follows:
local normal_animal: ANIMAL forget_eat_animal: ANIMAL forget eat end forget_all_animal: ANIMAL forget all end do -- this assignment is legal since all features present in the -- forget types are also present in the normal type forget_eat_animal := normal_animal forget_all_animal := normal_animal -- this assignment is illegal since the forget_animal lacks -- the eat feature and thus cannot be used as an ANIMAL normal_animal := forget_eat_animal normal_animal := forget_all_animal -- this assignment is legal since the forget all type -- has fewer or equal features than the forget eat type forget_all_animal := forget_eat_animal -- this assignment is only legal if only the feature `eat' -- is covariantly redefined in the type ANIMAL and thus -- forget eat is equivalent to forget all forget_eat_animal := forget_all_animal end
Now the cat-call example with the new forget types:
local a: ANIMAL c: CAT do -- illegal assignment, ANIMAL and CAT don't conform -- since CAT implicitly inherits from ANIMAL forget eat a := c a.eat (food) end
local a: ANIMAL forget all end c: CAT do -- legal, CAT conforms to ANIMAL forget all a := c -- illegal, ANIMAL forget all doesn't have a feature eat a.eat (food) end