Вот упрощенный случай:
class ANIMAL
class CAT inherit ANIMAL
class HOUSE_CAT inherit CAT
class DOG inherit ANIMAL
class
ENCLOSURE [G -> ANIMAL]
feature
specimens: LIST [G] --> The actual type will vary with the generic parameter
describe
do
print(specimens.generating_type)
end
class
APPLICATION
feature
test
local
l_cat: CAT
l_animal_enclosure: ENCLOSURE [ANIMAL]
l_cat_enclosure: ENCLOSURE [CAT]
l_house_cat_enclosure: ENCLOSURE [HOUSE_CAT]
l_dog_enclosure: ENCLOSURE [DOG]
do
create l_specimen
create l_animal_enclosure
l_animal_enclosure.describe --> LIST [ANIMAL]
l_animal_enclosure.specimens.add (l_cat) --> Fine, CAT conforms to ANIMAL
create l_cat_enclosure
l_cat_enclosure.describe --> LIST [CAT]
l_cat_enclosure.specimens.add (l_cat) --> Fine, CAT conforms to CAT
create l_house_cat_enclosure
l_house_cat_enclosure.describe --> LIST [HOUSE_CAT]
l_house_cat_enclosure.specimens.add (l_cat) --> ERROR, CAT does not conform to HOUSE_CAT
create l_dog_enclosure
l_dog_enclosure.describe --> LIST [DOG]
l_dog_enclosure.specimens.add (l_cat) --> ERROR, CAT does not conform to CAT
end
В вашем случае devices: LINKED_SET [G]
слишком расплывчато, ничто не доказывает, что JANITZA_DEVICE
является допустимым типом, потому что G
можетв конечном итоге ниже по иерархии (как HOUSE_CAT
-> CAT
; вы не можете заменить CAT
на HOUSE_CAT
, таким образом, список HOUSE_CAT
не может вместить CAT
) или в отдельной ветвииерархии (например, DOG
-> ANIMAL
; собака не является кошкой, они имеют общего предка).
Если {ENCLOSURE}.specimens
был объявлен как LIST [ANIMAL]
вместо LIST [G]
, describe
всегда будет печатать LIST [ANIMAL]
независимо от фактического универсального параметра, потому что тип не будет меняться, поэтому предыдущий код будет компилироваться и работать просто отлично. Точно так же, если {CONSUMPTION_SECTOR_CSV}.devices
был объявлен как LINKED_SET [SUNSPEC_DEVICE]
вместо LINKED_SET [G]
, он мог бы вместить всех потомков SUNSPEC_DEVICE
независимо от фактического типа G
.
В качестве альтернативы, вы могли бы перемещать деталиспецифично для JANITZA_DEVICE
от CONSUMPTION_SECTOR_CSV
до потомка CONSUMPTION_SECTOR_CSV
, где G
закрыто, как в
class
JANITZA_CONSUMPTION_SECTOR_CSV -- No generic here!
inherit
CONSUMPTION_SECTOR_CSV [JANITZA_DEVICE]
redefine
process_file -- Add the parts specific to `JANITZA_DEVICE` in the implementation
end
, что гарантирует, что devices
может содержать экземпляры JANITZA_DEVICE
.