【C# オブジェクト指向】インターフェース part2-9

今回はインターフェースについて解説します!
インターフェース
概要
インターフェースは,メソッドの定義を記述したものです.
抽象メソッドのみを持った抽象クラスと言えば考えやすいと思います.
インターフェース内で宣言したメソッドは,アクセス修飾子とabstract修飾子を付ける事ができません.
宣言したメソッドは,抽象メソッドと同じ扱いになります.
また,アクセスレベルはpublicになります.
(メソッドの先頭には public abstract が付いていると言う事です.)
インターフェースは,interface キーワード使います.
1 2 3 4 |
interface インターフェース名 { // メソッド } |
インターフェースは,クラスに実装する事ができます.
実装は,クラスの継承と同じように「:(コロン)」を使って記述します.
1 2 3 4 |
class クラス名 : インターフェース名 { } |
実際に記述して実行してみます.
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; namespace Training { class Program { static void Main(string[] args) { Student shirou = new Student(); shirou.Display(); } } interface IHuman { // フィールドは宣言できません. void Display(); // public abstract } class Student : IHuman { public void Display() { Console.WriteLine("Student"); } } } |
実行結果

抽象クラスの時と,実行結果は変わらないです.
また,抽象メソッドと同じように,インターフェースで宣言したメソッドは,実装したクラス内で宣言しなおす必要があります.(宣言しないとコンパイルエラーになります.)
言わば,メソッドの実装の強制です.
多重継承ができない
抽象クラスとインターフェースの機能,両方とも解説してきました.
どちらも,継承先,実装先にメソッドの実装を強制する事ができます.
しかも,抽象クラスとインターフェースを比較すると,インターフェースは抽象クラスの下位互換です.
表にするとこんな感じですね.

それなら,インターフェースは要らなくなりますよね?
しかし,多重継承という問題があります.
多重継承とは,複数のクラスから継承する事です.
1つのサブクラスに対して,複数のスーパークラスを持つ事です.
C#では多重継承をすることができません.

それを解消するのが,インターフェースです.
インターフェースは1つのクラスに複数実装する事ができます.
また,継承と同時に使う事ができます.

複数実装する時の記述は,「,(コンマ)」を使って記述します.
1 2 3 4 |
class サブクラス名 : スーパークラス名, インターフェース名, ... { } |
例えば,このように記述します.
1 2 3 4 |
class Student : Human, IDisplay { } |
使用例としては,こんな感じです.
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using System; namespace Training { class Program { static void Main(string[] args) { Student shirou = new Student(20, "シロウ"); shirou.Display(); } } interface IDisplay { // フィールドは宣言できません. void Display(); // public abstract } abstract class Human { protected int age; protected string name; } class Student : Human, IDisplay { public Student(int age, string name) { this.age = age; this.name = name; } public void Display() { Console.WriteLine("年齢:" + age + " 名前:" + name); } } } |
実行結果

まとめ
インターフェースは,スーパークラスで宣言したくないメソッドがある時に,インターフェースで宣言したり,
インターフェースを複数のサブクラスに実装させたい,とかそういう時に使う感じですね.
後は,型として使うというのもありますね.
型として使う場合は,宣言した変数に代入できるのは,インターフェースで実装したクラスのインスタンスのみになります.
今回でオブジェクト指向編は完結となります(本編は)
まだまだ紹介しきれてない機能がありますが,番外partで紹介していこうかと思ってます.
次回からは,コレクションについて解説したいと思います!
-
前の記事
【C# オブジェクト指向】継承④ 抽象クラス part2-8 2018.10.27
-
次の記事
【C# コレクション】List part3-1 2018.10.29
コメントを書く