動態分派方法

結構化類型的行為由其方法代表。 這些方法只能針對其結構化類型的實例來呼叫。 建立子類型時,它所繼承的屬性中是針對超類型所定義的方法。 因此,超類型的方法也可以針對其子類型的任何實例執行。

如果您不想要將定義給超類型的方法用於特定子類型,您可以 置換 方法。 置換方法表示特別針對給定的子類型來重新實作它。 這有助於方法的 動態分派 (也稱為多型性) ,其中應用程式會根據結構化類型實例的類型 (例如,它在結構化類型階層中的位置) 來執行最特定的方法。

若要定義置換方法,請使用 CREATE TYPE (或 ALTER TYPE) 陳述式,並在 METHOD 子句之前指定 OVERRIDING 子句。 如果未指定置換,則會使用原始方法 (屬於超類型)。 如果要定義置換方法,必須符合下列條件:
  • 您要建立 (或變更) 的類型必須是您要置換其方法之結構化類型的子類型。
  • 您要宣告之方法的簽章 (方法的名稱和參數清單) 與屬於超類型之方法的簽章相同。
  • 置換方法必須隱含地只置換一個原始方法。
  • 您想要置換的常式是使用者定義的結構化類型實例方法。
  • 原始方法未以 PARAMETER STYLE JAVA 宣告。

下列範例示範置換方法的範例實務:

資料類型:
CREATE TYPE a AS (z VARCHAR(20))
    METHOD foo(i INTEGER) RETURNS VARCHAR(80)
        LANGUAGE SQL;

CREATE TYPE b UNDER a AS (y VARCHAR(20))
    OVERRIDING METHOD foo(i INTEGER) RETURNS VARCHAR(80);

CREATE TYPE c UNDER a AS (x VARCHAR(20))
    OVERRIDING METHOD foo(i INTEGER) RETURNS VARCHAR(80);

CREATE TYPE d UNDER b AS (w VARCHAR(20))
    OVERRIDING METHOD foo(i INTEGER) RETURNS VARCHAR(80);
在此狀況下, a 是超類型。 類型 bca的子類型。 最後, db 的子類型
方法:
CREATE METHOD foo(i INTEGER) FOR a
  RETURN "In method foo_a. Input: " | char(i) | self..z | ".";

CREATE METHOD foo(i INTEGER) FOR b
  RETURN "In method foo_b. Input: " | char(i) | self..z |
         " y = " | self..y | ".";

CREATE METHOD foo(i INTEGER) FOR c
  RETURN "In method foo_c. Input: " | char(i) | self..z |
         " y = " | self..y | " x = " | self..x | ".";

CREATE METHOD foo(i INTEGER) FOR d
  RETURN "In method foo_d. Input: " | char(i) | self..z |
         " y = " | self..y | " w = " | self..w | ".";

這裡的原始方法是 fooA。 fooB、fooC 和 fooD 明確置換 fooA。 fooD 隱含地置換 fooB 和 fooA。 同樣地, fooB 隱含地置換 fooA ,而 fooC 隱含地置換 fooA。 (請注意,明確置換隱含隱含置換。)