ルルのゲーム開発備忘録

主にUnityやC#に関する情報を気まぐれに投稿していきま~す

【C#】インターフェースと抽象クラス、どう使い分けてる?

はじめに

こんにちは、ルルです。
ポリモーフィズムなコードやストラテジーパターン、設計を意識してインターフェースや抽象クラスを使うことがあると思うのですが、みなさんはこの二つをどう使い分けていますか?

例えば、インターフェースはメソッドの実装はできないけど各クラスでそれぞれ書いてしまえばいいですし、抽象クラスだってabstrackメソッドやvirtualメソッドをオーバーライドして書いてしまえば、ふるまいはそれぞれのインスタンスになります。
if文やswitch文を減らすことならどちらでもできてしまいます。

自分の現状の考え

自分も以前はよくわからず結構適当に使い分けてたのですが、いまは自分の中でルールを決めてます。
それは、「インターフェースは外部クラスから呼ぶメソッドを定義する」「抽象クラスは、子となるクラスたちの(内部での)共通の性質・ふるまいを定義する」です。

まあ、つまりざっくりいうと別クラスから呼ぶメソッドはインターフェースで定義して、共通して毎回同じようなメソッド書いてるなーって場合はvirtualとかで定義するようにしてます。
なので両方を同時に使うこともあります。その場合は、抽象クラス側にインターフェースを持たせたりしてます。

ググって調べたけど...

なぜこのような使い分けについて考えたかというと、どうしてもインターフェースと抽象クラス両方をつかったほうがわかりやすそうなケースがあって、そのときにどう書けばいいのだろうかと思って調べたのです。
ところが、両方を使う場合の情報があまりなかったです、、、ただ両方を使うことは別に悪いことではなさそうだったので調べたものを参考にして自分の中でこういうルールで使うように決めました。