[英]Eiffel: Creator instruction applies to target of a deferred type
deferred Class A
feature --
item: X -- X is deferred
set_item_for_some_reason (param: N)
do
create item.make_from_param (param)
end
end -- class
Class B inherit
A
feature --
item: Y -- Y not deferred inherits from X
end -- class
我想在同一個類中創建一個屬性,該屬性將在后代中定義,並獲得一個Creator instruction applies to target of a deferred type
Error的Creator instruction applies to target of a deferred type
錯誤以減少上下文的方式產生感覺,但在我不希望使用的上下文中去做吧。
對我而言,能夠在當前的延遲類中創建對象確實很有意義,我將不必在所有后代中實現! 這將是一個錯誤的設計...類似這樣的東西:
deferred Class A
feature --
item: X -- X is deferred
set_item_for_some_reason (param: N)
do
set_item_from_param (param)
end
set_item_from_param (param: N)
deferred
end
end -- class
Class B inherit
A
feature --
item: Y -- Y not deferred
set_item_from_param(param: N)
do
create item.make_from_param (param)
end
end -- class
我的設計是否錯了?還是我所了解的有關Eiffel編譯器的限制? 如果是的話,最佳做法是什么?
一種可能的解決方案是使用泛型類。 在類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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.