Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

複数のクラスからのサブクラスの作成

複数のスーパークラスの指定

複数のクラスから継承する場合は,以下のように&を使用してスーパークラスの組み合わせを示します。

classdefClassName<SuperClass1 & SuperClass2

クラスの構文の詳細については、サブクラスの構文を参照してください。

クラス メンバーの互換性

複数のスーパークラスから派生するサブクラスを作成すると、指定されたスーパークラスが定義する、プロパティ、メソッド、イベントをサブクラスが継承します。2 つ以上のスーパークラスで同じ名前のプロパティ、メソッド、またはイベントを定義している場合は、これらの定義をはっきりと区別する方法がなければなりません。互換性のないクラス メンバーを定義する 2 つ以上のクラスからサブクラスを派生することはできません。

さまざまな状況で名前と定義の競合を解決する方法を以下に示します。

プロパティの競合

2 つ以上のスーパークラスが同じ名前でプロパティを定義する場合、以下の少なくとも 1 つが成り立たなければなりません。

  • すべてのプロパティ、またはある 1 つプロパティを除いたすべてプロパティに対して、SetAccessGetAccess属性をprivateに設定しなければならない

  • プロパティがすべてのスーパークラスで同じ定義をもつ (たとえば、すべてのスーパークラスが共通の基底クラスからプロパティを継承した場合)

メソッドの競合

2 つ以上のスーパークラスが同じ名前でメソッドを定義する場合、以下の少なくとも 1 つが成り立たなければなりません。

  • メソッドのAccess属性がprivateで定義元のスーパークラスのみがメソッドにアクセス可能。

  • メソッドがすべてのサブクラスにおいて同じ定義をもつ。この状態は、すべてのスーパークラスが共通の基底クラスからメソッドを継承し、継承した定義をスーパークラスがオーバーライドしない場合に発生します。

  • サブクラスによるメソッドの再定義によって、すべてのスーパークラスの間における複数の定義のあいまいさを排除。そのため、スーパークラスのメソッドではそのSealed属性をtrueに設定してはなりません。

  • 1 つのスーパークラスだけでメソッドをSealedとして定義し、サブクラスはシールされたメソッドの定義を使用する。

  • スーパークラスは、メソッドをAbstractとして定義し、メソッドの定義はサブクラスに依存する。

イベントの競合

2 つ以上のスーパークラスが同じ名前でイベントを定義する場合、以下の少なくとも 1 つが成り立たなければなりません。

  • イベントのListenAccess属性とNotifyAccess属性がprivateでなければならない。

  • イベントがすべてのスーパークラスで同じ定義をもつ (たとえば、すべてのスーパークラスが共通の基底クラスからイベントを継承した場合)。

多重継承

複数のクラスからサブクラスを定義するときに発生する可能性のある競合を解決しなければならないので、この手法が役に立たない場合があります。たとえば、将来のバージョンでスーパークラスを改良すると、新しい競合が発生する可能性があります。

このような問題を防ぐには、制限のないスーパークラスを 1 つだけ実装します。他のすべてのスーパークラスでは、すべてのメソッドを以下のようにします。

  • 抽象型

  • サブクラスにより定義

  • 無制限のスーパークラスから継承

複数の継承を使用する場合は、すべてのスーパークラスの定義で競合がないことを必ず確認してください。

関連するトピック