【问题标题】:Eiffel: Can I use `expanded SOME_DEFERRED_CLASS`?Eiffel:我可以使用 `expanded SOME_DEFERRED_CLASS` 吗?
【发布时间】:2016-11-19 03:43:49
【问题描述】:

x: expanded SOME_DEFERRED_CLASS 是不可能的,因为:

  1. deferred 类不能用于对象实例化。
  2. expanded 类型不允许polymorphism

我是否遗漏了什么,或者我是对的吗?

【问题讨论】:

    标签: polymorphism abstract-class instantiation eiffel


    【解决方案1】:

    x: expanded A_CLASS 是一种过时的语法。它不再受支持。

    但是expanded 可以在类定义中使用。在这种情况下,正如您所引用的,不可能同时拥有延迟类和扩展类。

    作为一个简单的规则,可以定义一个只有一个来自下一个列表的类:expandeddeferredseparatefrozen

    如果您希望“扩展”一个已经存在的实现,您只需要创建这个类的扩展继承者。查看 Eiffel 的内核库,您可以找到这样的示例(例如 INTEGER_32 - 扩展类 - 继承 INTEGER_32_REF

    【讨论】:

    • "x: expanded A_CLASS 是一种过时的语法。它不再受支持。" ← 哇,我一点想法都没有!谢谢!顺便问一下,你从哪里找到这些信息的?您能否发布一个链接以供将来参考?
    【解决方案2】:

    你是对的。推理可以改写如下:

    1. 没有类型直接符合扩展类型。
    2. 如果一个类型被扩展,它只符合它自己。 (从 1 开始。有更多的一致性规则,但对于扩展类型,它们最多只能涉及泛型参数。)
    3. 只有在正确设置的情况下才能使用特定类型的实体。
    4. 仅当使用相同类型的对象实例化时,才能使用扩展类型的实体。 (从 2 到 3。)
    5. 延迟类型不能用于实例化。
    6. 不能使用延迟扩展类型的实体。 (从 4 到 5。)

    因此,即使在技术上可能允许声明延迟扩展类型的实体,但它们不能被使用。

    正如另一个答案中正确指出的那样,在现代 Eiffel 中,只能使用一个类标记来指示其状态,因此,在语法上不可能声明延迟扩展类或类型。但是,即使允许,也没有用。

    编辑:

    有两种一致性:直接一般。直接一致性反映了父子关系:没有传递性或自反性规则,NONE 类型的特殊规则等。它基本上说明,如果类 C 继承自类 P,则类型C 在特定条件下符合 P 类型。条件排除了C展开的情况。

    一般一致性使用直接一致性作为基本情况之一以及其他一些情况,例如自反性规则“类型符合自身”。因此,规则“没有类型直接符合扩展类型”仅仅意味着继承链接对于扩展类型无关紧要。但是由于自反性规则,扩展类型仍然符合自身。

    所有这些细节都在注释“From 1”后面。更多信息请参见Standard ECMA-367(第 8.14 节)。

    【讨论】:

    • 想象类P(父类)和C(子类),其中C继承自P
    • 如果 PC 不是扩展类,则类型 C 符合类型 P,但反之则不然。但是,如果 PC(或两者)被扩展,则 C 类型都不会符合 P,反之亦然,因为 “没有类型直接符合扩展类型。”。跨度>
    • 我要讨论的是№2:“如果一个类型被扩展,它只符合自己。(从1开始。有更多的一致性规则但是对于扩展类型,它们最多只能涉及泛型参数。)”。 “从1”怎么来的?这怎么可能在逻辑上有效? № 1 告诉我们“没有类型直接符合扩展类型。”,但是类型一致性不能双向工作:如果类型 C 符合类型 P,那并不意味着类型 P符合 C 类型。因此,"From 1." 一定是错误的,你不同意吗?或者它与在№ 1 中使用“直接”这个词有什么关系?这是什么意思?
    • @g4v3,确实存在一致性和直接一致性的概念。我将在答案中添加一些细节以供澄清。
    猜你喜欢
    • 2019-07-04
    • 2016-10-18
    • 2015-03-01
    • 2019-12-10
    • 2011-05-26
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多