C#で多重継承したい

posted in: C# | 0

こんにちは。阿部です。

C#ではクラスの継承を行う際、親クラスを一つしか指定することができません。一方で、C++など、複数クラスから継承することを許す言語もあります。では、C#で複数クラスを継承したくなったときはどうすればよいのでしょうか。

ここでは、”スプーン”クラスと”フォーク”クラスを継承して、”先割れスプーン”クラスを作る例を考えてみましょう。ちなみに、先割れスプーンは英語で”spork”と言います。”spoon + fork”で”spork”です。
多重継承

スプーンとフォークは、次のようなクラスとします。
フィールドとメソッドが一つずつ定義されています。

それぞれ継承して合成する

Spoonを継承したSpoonImplと、Forkを継承したForkImplをそれぞれ作り、それらをメンバーとして持ったSpork型を作ります。

UML

ちょっと長いですが、コードは次のようになります。

動作を確認してみましょう。

実行結果:

ちゃんとメソッドがオーバーライドされています。sporkSpoonとしての振る舞いと、Forkとしての振る舞いをしているように見えます。

多態性

次に、多態性について見ていきます。③で、SporkSpoon型やFork型に変換する演算子を定義しています。
これによって、SpoonForkが要求される場面で、Sporkを代わりに使えるようになっています。

例えば、SporkのインスタンスをForkのコレクションに追加することができます。

このようにSporkからForkへの変換(アップキャスト)はできるのですが、ForkからSporkに戻すこと(ダウンキャスト)ができません。このあたりが限界のようです。

そこで、代替案として次のようなstaticメソッドを定義しています。

これで、ForkのコレクションからSporkを取り出すことができます。

まとめ

  • C#で複数クラスを継承したい場合は、個別に継承したクラスを作り、それらをメンバに持たせたクラスを作ります。(①、④)
  • 委譲によって、複数クラスのメソッドを継承しているように見せられます(⑤)
  • 型変換演算子によって、アップキャストを模倣することができます。(③)
  • ダウンキャストの模倣はできませんでしたが、どうしても必要な場合は、子クラス側に変換用のstaticメソッドを定義しましょう。
LINEで送る
Pocket