继承和类型可替代性

在类型层次结构中,子类型自动继承对其超类型定义的所有例程。因此,如果调用带有子类型的自变量的例程,并且没有对该子类型定义例程,那么数据库服务器可调用对超类型定义的例程。 类型可替代性指的是这样的能力:在预期为超类型的实例时使用子类型的实例。例如:假定创建例程 p_info(),它接受类型为 person_t 的参数并返回类型为 person_t 的实例的姓氏和生日。如果没有注册其他 p_info() 例程,并且使用类型为 employee_t 的参数来调用 p_info(),那么该例程将返回类型为 employee_t 的实例的姓名和生日字段(从 person_t 继承而来)。由于 employee_t 会继承其超类型 person_t 的函数,所以这是可能发生的。

通常,当数据库服务器尝试对例程进行求值时,数据库服务器将搜索与您调用例程时指定的例程名和自变量相匹配的特征符。如果找到这样的例程,那么数据库服务器将使用此例程。如果找不到精确匹配,那么数据库服务器尝试查找以下例程:具有相同的名称,并且其自变量类型是调用例程时指定的自变量类型的超类型。例如:假设数据库服务器搜索的是在使用子类型为 sales_rep_t 的自变量调用 get() 例程时可以使用的例程。那么即使没有任何在 sales_rep_t 类型上定义的 get() 例程,数据库服务器也会搜索例程,直到在层次结构中找到在超类型上定义的 get() 例程为止。在本例中,没有对 sales_rep_t 及其超类型 employee_t 定义 get() 例程。然而,由于为 person_t 定义了例程,所以将调用此例程来对 sales_rep_t 的实例执行操作。

图: 数据库服务器如何在类型层次结构中搜索例程的示例


开始图描述 - 在环境文本中对此图进行了描述。- 结束图描述

数据库服务器搜索它可以使用的例程的过程称为例程解析。有关例程解析的更多信息,请参阅 GBase 8s 用户定义的例程与数据类型开发者指南