如何继承埃菲尔铁塔中的HASH_TABLE?

How to inherit from HASH_TABLE in Eiffel?

我想制作 HASH_TABLE 的派生 class,它实现了一些附加功能。我试过这样实现它:

class HASH_TABLE2[G->HASHABLE]
inherit
    HASH_TABLE[G,G]
        rename
            make as make_2
        end
create
    make
feature
    make (capacity_ : INTEGER)
        do
            make_2(capacity_)
        end
end

我收到这个错误:

Error: Creation instruction uses call to improper feature.

Feature name: make_2 (n: INTEGER_32)
Line: 1156
      do
->      create Result.make (n)
        if object_comparison then

我不明白为什么。如果我对 inherit ARRAY[G] 做同样的事情,那么它工作正常。

问题是功能 empty_duplicate(在错误消息中提到)使用原始创建过程 make 创建了哈希 table 的新实例。但是,此功能不再是 HASH_TABLE2 中的创建过程。解决方案是相应地重新定义empty_duplicate

class HASH_TABLE2 [G -> HASHABLE]

inherit
    HASH_TABLE [G, G]
        rename
            make as make_2
        redefine
            empty_duplicate
        end

create
    make

feature
    
    make (capacity_: INTEGER)
        do
            make_2 (capacity_)
        end

feature {NONE} -- Duplication

    empty_duplicate (n: INTEGER_32): like Current
            -- <Precursor>
        do
            create Result.make (n)
            if object_comparison then
                Result.compare_objects
            end
        end

end

请注意,尽管 empty_duplicate 重新声明的主体看起来与原始主体相同,但它从 HASH_TABLE2 调用 makemakeHASH_TABLE因为后者改名为make_2.

这让我们想到 HASH_TABLE 中的 make 是否可以保留 HASH_TABLE2 中的创建过程。除非给定的示例是简化的,否则这是可行的并且编译没有问题:

class HASH_TABLE2 [G -> HASHABLE]
inherit
    HASH_TABLE [G, G]
create
    make
end