簡體   English   中英

埃菲爾鐵塔:創建者指令適用於延遲類型的目標

[英]Eiffel: Creator instruction applies to target of a deferred type

A級

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

B級

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

為了確保我們在同一頁上,這是XY類的代碼:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM