.net column

.NET開発者のためのブログメディア

C#のabstract classとは?インターフェイスについても併せて解説!

2021年04月19日
SE
C#のabstractclassはとても難しいですね。
PM
そうかもしれませんが、C#のabstractclassを知ると、オブジェクト指向についての理解も深まりますよ。

C#のabstract classとは?


C#のabstract classは抽象クラスを宣言するためのキーワードです。抽象クラスには以下のような特徴があります。

1.抽象クラスはインスタンス化できない(newできない)
2.抽象クラスは抽象メソッドや抽象アクセサを記述できる
3.abstract classとsealedは矛盾するため併用できない
4.抽象クラスから派生した普通のクラスは、全ての抽象メソッドとアクセサを、オーバーライドして実装する必要がある

abstract classの特徴

上のabstract classの4つの特徴を実例で説明しましょう。以下のC#のサンプルをご覧ください。

abstract classの制約

上のC#サンプルは複数のエラーが出ます。まずMainメソッドの「Animal a = new Animal();」でAnimalのインスタンスを生成できないというエラーになります。また「sealed abstract class Animal」で、抽象クラスには派生を禁じるsealedは使用できないというエラーになります。

またsealedを消しても、「class Dog : Animal」で継承抽象メンバーのWalk()を実装していないというエラーになります。

修正版のサンプル

上のエラーを解消したC#サンプルが以下になります。

実行結果は以下になります。

犬が歩く。

抽象メソッドについて

上のC#サンプルのAnimalには「public abstract void Walk()」という空のメソッドがあります。これを抽象メソッドと言います。抽象メソッドは抽象クラスのみに実装できるので、クラスの宣言にabstractが無いとエラーになります。

抽象クラスを拡張したクラスでは、抽象クラスの抽象メソッドをoverrideを付けて同名で実装することが強制されます。この仕様は何のためにあるのでしょうか。

抽象メソッドの用途

抽象メソッドは以下のC#サンプルのようなことを実現するためにあります。

抽象メソッドによりポリモーフィズムを実現できる

上のC#サンプルには抽象クラスのAnimalを拡張したDogクラスとCatクラスがあります。MainメソッドでAnimal型のListを宣言し、それにDogとCatを生成して追加しています。DogとCatの親クラスがAnimalのためこれが可能になります。

そしてforeachループでListの中のインスタンスのWalkメソッドを呼び出しています。Walkメソッドの実装が強制されているからこれが可能になるのです。このようなやり方は「ポリモーフィズム」と呼ばれ、オブジェクト指向の重要な要素となっています。

実行結果は以下になります。

犬が歩く。
猫が歩く。

インターフェイスについて

C#には抽象クラスに似た機能でインターフェイスがあります。上のサンプルのAnimal、Dog、Catを以下のように変更しても、全く同じように動作します。

インターフェイスのメリット

抽象クラスとインターフェイスはどう使い分ければよいのでしょうか。それをするにはまず、それぞれの違いを知ることが必要です。インターフェイスにあって抽象クラスに無い機能については、インターフェイスは以下のように複数を実装することができます。

インターフェイスにかつてあった制約

C#は多重継承ができないため、複数の抽象クラスを親に持つことはできません。そうであれば、常に抽象クラスよりインターフェイスを使った方が良いのでしょうか。しかしインターフェイスには抽象クラスと比べて、C# 8.0以前では以下のような制約がありました。

・フィールドを持つことが出来ない。
・インターフェイスのメソッドは全て抽象メソッドにしなければならず、実装を持てない
・メンバーは全てpublic扱いで、privateなどにできない
・staticな静的メンバーを持つことが出来ない

C# 8.0以降のインターフェイス

ところがC# 8.0からは上記のようなインターフェイスの制約は撤廃されました。C# 8.0からはインターフェイスで以下のようなことができます。

機能が強化されたインターフェイス

上のC#サンプルを実行すると、以下のように表示されます。

動物が歩く。

DogクラスにはWalkメソッドが無いので、インターフェイスで実装したWalkの処理が呼ばれています。インターフェイスではC# 8.0以前ではできなかったstaticなフィールドやprivateもこのように利用できます。

ただしstaticではない動的なフィールドは、C# 8.0以降のインターフェイスでも持つことはできません。抽象クラスのインターフェイスに対する優位性は、動的なフィールドを持てることだけになったと言えます。

SE
なるほど。C#のabstractclassを知ることで、オブジェクト指向についての理解も深まりそうですね。
PM
その通りです。しっかり理解して、活用してください。

C#のabstract classを使いこなそう

C#のabstract classについて解説しましたが、ご理解頂けましたでしょうか。

似た機能を持つインターフェイスも併せて紹介しましたが、開発現場においては抽象クラスよりインターフェイスの方が相応しいケースが多いと思われます。抽象クラスの使い道は抽象的な親クラスを1つだけ持たせたい時に限りますが、それが必要な時は是非活用しましょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags

Jobs