Eiffel:有没有办法禁止使用任何特别继承的创建方法?

Posted

技术标签:

【中文标题】Eiffel:有没有办法禁止使用任何特别继承的创建方法?【英文标题】:Eiffel: is there a way to prohibit the use of any particularly inherited creation method? 【发布时间】:2018-10-30 14:43:23 【问题描述】:

由于default_create 始终是创建方法的示例,如果我不想让类的后代将其用作创建方法,则可以将其用作create some_instance 的实例创建方法有没有办法这样做?

一个

deferred class A
feature
   make (a_db_connection: DB_CONNECTION)
      do
          default_create
          db_connection := a_db_connection
      end

B

class B
inherit
    A
create
    make
    -- default_create -- I'd be able to do that and want to avoid it

【问题讨论】:

【参考方案1】:

只要一个过程未被列为创建过程,它就不能用于创建对象。在原始示例中,可以使用make 创建类B 的实例,但不能使用default_create,即创建指令create b 将被标记为错误(假设b 的类型为B) .

另一方面,如果根本没有create 子句,并且类没有被延迟,那么过程default_create 用于创建对象。这可以通过有一个空的创建子句来禁止:

class C
inherit
    A
create -- There are no creation procedures, no instance of the class can be created.
feature
    ...
end

总结:

    没有创建子句:使用了default_create。 空创建子句:无法创建实例。 非空创建子句:只能使用列出的过程进行创建。

【讨论】:

Thx,我想指出的是,如果 A 类想要忘记 default_create 过程并避免使用它,您可以通过 NONE 导出限制它作为客户端的使用,但不能避免将其用作任何后代的创建方法?我这样清楚吗?我不希望任何后代能够使用 default_create 作为创建过程是可能的,还是后代继承其父母@“任何”意思的行为的想法的一部分? @Pipo 在 Eiffel 中没有“私有”方法、字段等概念。父母的所有功能都由孩子继承并且可以使用。 我想,和我们一样,我们必须处理继承的行为 ;-)

以上是关于Eiffel:有没有办法禁止使用任何特别继承的创建方法?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法禁止我的类的子类化?

Burnikel 和 Ziegler 算法 2 的 Eiffel 实现中的错误

Eiffel:在运行时创建类型化对象

有没有办法检查一个数组的任何内容是不是在 Roblox 的另一个数组中

如何禁止使用Javascript保存密码泡沫铬?

Eiffel:转换方法在代理调用参数的情况下是不是有效?