継承とは、あるインタフェースで定義したオペレーションを、別のインタフェースに引き継ぐための定義です。オペレーションなどを引き継ぐ元のインタフェースのことをベースインタフェースと呼びます。継承するインタフェースは、ベースインタフェースのスコープ名をコロン(:)に続いて指定します。
継承の指定例を以下に示します。この例では、インタフェース“A”がベースインタフェースです。ベースインタフェースを複数指定する場合は、カンマ(,)で区切って定義してください。
interface A {
long op1(in long a);
};
interface B:A {
long op2(in long b);
};ベースインタフェースを継承したインタフェースでは、新しい要素(定数、型、例外、属性、オペレーション)を追加して宣言できます。継承元のインタフェースで定義した同じ名前の型、定数、および例外が再定義できます。2つ以上のインタフェースを継承する場合、継承元の同じ識別子があると継承できません。
interface A {
const long a = 10;
};
interface B:A {
const long a = 100;
long op(in long A::a);
};“継承するインタフェース”で指定されたインタフェースを直接のベースと呼びます。また、ベースインタフェースが、さらに別のインタフェースを継承する場合、このインタフェースを間接のベースと呼びます。
以下の例では、インタフェース“C”から見た場合に、インタフェースBが直接のベース、インタフェースAが間接のベースとなります。
interface A { ... };
interface B:A { ... };
interface C:B { ... };インタフェースは、複数の直接のベースから継承できます。この継承の方法を多重継承と呼びます。直接のベースを指定する順番を変えても、継承されるインタフェースは同じものになります。
多重継承の指定例を以下に示します。
interface A { ... };
interface B:A { ... };
interface C:A { ... };インタフェースの継承で、1つのインタフェースが直接のベースとして2回指定されることはありません。ただし、間接のベースとして複数回指定されることがあります。
間接のベースとして複数回指定される例を以下に示します。
interface A { ... };
interface B:A { ... };
interface C:A { ... };
interface D:B,C { ... };これらのインタフェースの関係を以下に示します。
B → A ↑ ↑ D → C
ベースインタフェースの要素への参照に、あいまいさがあってはなりません。ベースインタフェースの要素に同名の定数、型、例外が存在すると、あいまいさが生じる原因となります。
あいまいさが生じる例を以下に示します。この例では、インタフェースCのXの型にあいまいさが生じます。
interface A {
typedef long X;
};
interface B {
typedef short X;
};
interface C:A,B {
const X = 100;
};多重継承の場合、ベースインタフェースで定数、型、例外が再定義されても、継承されるオペレーションや属性のシンタックスは変わりません。
以下に例を示します。
module Module1 {
const long L = 3;
interface A {
typedef float s[L];
void f(in s para); // Sは3つのfloatからなります
};
interface B {
const long L = 4;
};
interface C:B,A { }; // f()のシグネチャは?
};インタフェースAを定義した時点で、定数Lの実体との結びつきが決まるため、インタフェースCにおけるオペレーションfの形式は、以下のようにインタフェースAと同じになります。
typedef float s[3]; void f(in s para);
この規則のために、導出されたインタフェースの中で定数/型/例外を再定義しても、ベースインタフェースから継承したオペレーション/属性へは影響ありません。