Возможное решение - использовать универсальные классы.В классе A
формальный универсальный параметр имеет ограничение на создание, что соответствующий фактический универсальный параметр должен иметь конкретную процедуру создания:
class A [G -> X create make_from_param end] feature
item: detachable G
set_item_for_some_reason (param: N)
do
create item.make_from_param (param)
end
end
Класс-потомок может указывать фактический универсальный объект, имеющий эту процедуру создания.:
class B inherit
A [Y]
end
Чтобы убедиться, что мы находимся на одной странице, вот код классов X
и Y
:
deferred class X feature
make_from_param (param: N)
deferred
end
end
class Y inherit
X
create
make_from_param
feature
make_from_param (param: N)
do
end
end
Вы можете добавить как можно больше таких потомков.как хотите.Основное ограничение заключается в том, что всякий раз, когда используется класс A
, его фактический универсальный параметр должен иметь указанную функцию как функцию создания.Например, можно объявить тип A [Y]
.Но A [X]
вызовет ошибку.
Если у потомка тип item
еще не зафиксирован, его можно распространить, повторив ограничение на формальный универсальный:
class C [G -> X create make_from_param end] inherit
A [G]
end