Forget / Keep Mechanism
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