如何继承埃菲尔铁塔中的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
调用 make
与 make
从 HASH_TABLE
因为后者改名为make_2
.
这让我们想到 HASH_TABLE
中的 make
是否可以保留 HASH_TABLE2
中的创建过程。除非给定的示例是简化的,否则这是可行的并且编译没有问题:
class HASH_TABLE2 [G -> HASHABLE]
inherit
HASH_TABLE [G, G]
create
make
end
我想制作 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
调用 make
与 make
从 HASH_TABLE
因为后者改名为make_2
.
这让我们想到 HASH_TABLE
中的 make
是否可以保留 HASH_TABLE2
中的创建过程。除非给定的示例是简化的,否则这是可行的并且编译没有问题:
class HASH_TABLE2 [G -> HASHABLE]
inherit
HASH_TABLE [G, G]
create
make
end