Difference between revisions of "Forget / Keep Mechanism"
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 | ||
+ | |||
+ | inherit | ||
+ | |||
+ | FOOD | ||
+ | |||
+ | end | ||
+ | </e> | ||
+ | |} | ||
− | cat-call | + | ===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 15:39, 19 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