【问题标题】:Derived types and sub types in AdaAda 中的派生类型和子类型
【发布时间】:2010-04-21 05:32:46
【问题描述】:

有什么区别?

【问题讨论】:

  • 这和prolog有什么关系?

标签: types ada


【解决方案1】:

首先,术语:它是“Ada”,而不是“ADA”——它是以“Ada Lovelace”命名的;这不是首字母缩写词。

子类型与其基类型兼容,因此您可以将基类型的操作数与基类型的操作数混合使用。例如:

subtype Week_Days is Integer range 1..7;

由于这是一个子类型,您可以(例如)将1 添加到工作日以获得下一个工作日。

派生类型是完全独立的类型,具有与其基类型相同的特征。不能将派生类型的操作数与基类型的操作数混合。例如,如果您使用:

type Week_Day is new Integer range 1..7;

那么您将能够将整数添加到工作日以获得另一个工作日。要对派生类型进行操作,您通常会自己定义这些操作(例如,创建一个包)。同时,派生类型确实“继承”了其基类型的所有操作(甚至是一些可能没有意义的操作),因此您仍然可以得到加法。

【讨论】:

  • 我厌倦了解释 ADA 的事情,现在我只是例行地编辑任何有问题的问题或答案并修复它。如果有人想知道原因,他们可以查一下。
  • 您当然可以在 Week_Day 上加 1 以获得下一个 Week_Day!但不是Integer'(1)
【解决方案2】:

来自Wikibooks

给定类型的子类型将相互兼容。

派生类型是从现有类型创建的新的、成熟的类型。像任何其他类型一样,它与其父类型不兼容;但是,它继承了为父类型定义的原始操作。

【讨论】:

    【解决方案3】:

    基本区别在于派生类型是不同的类型。您不能只将一个分配给另一个,或者在表达式中一起使用它们。另一方面,子类型与其原始类型是赋值兼容的。您可以一起使用它们而无需输入任何类型转换代码。

    不过,子类型的范围会比基本类型更窄,因此可能会有范围检查(我相信可以从中引发 Constraint_Error)。所以你还是要小心。

    【讨论】:

    • 一个子类型不能有更宽的范围,但它不能有相同的范围吗? subtype My_Float is Float;
    • 是的,它可以有相同的范围。这是“重命名”类型的一种常用方法。在这种情况下,智能编译器可能会省去约束检查。在某些情况下,它也应该省去循环内的约束检查。当然,如果您感到不舒服,您可以禁用所有约束检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多