【C#】オブジェクト指向(インターフェース)

インターフェースとは

抽象クラスの概念をさらに推し進めたものが、インターフェースという概念です。

継承、抽象クラスに関しては下記の記事をご参考ください。

【C#】オブジェクト指向(継承とは)

2021.03.30

【C#】オブジェクト指向(抽象クラスと抽象メソッド)

2021.04.01

インターフェースとは、クラスにメソッドやプロパティの実装を強制するための機能です。

インターフェースを実装しているクラスは、インターフェースで定義されているメソッドやプロパティを必ず実装している必要があります。

実装していない場合は、コンパイラエラーになってしまいます。
また、インターフェースには実装部分はなく定義のみを記述します。

抽象クラス同様、インターフェースもインスタンスを生成することはできません。

 

インターフェースを使用するメリット

インターフェースで実装を強制することにより、同じインターフェースを実装しているクラスは、同一のものとして処理するを記述することができます。

また、インターフェースを利用して強制的にクラスの機能を制限することにより、余計なメンバ(フィールドやメソッド)へのアクセス制限をかけることが可能となります。
これにより、プログラマーは、自分が利用すべきインターフェースさえ覚えておけば、必要なメンバだけを利用することができます。
結果として、保守性・開発効率の向上につながります。

 

インターフェースの使い方

interface インターフェース名
{
}

インターフェースには、メソッドの実装やフィールドを持つことはできません。

インターフェースの中には、定義のみを記述します。

インターフェース名には「ICar」「IDatabase」などのように、先頭に大文字の「 I 」をつけることが慣習となっています。

 

サンプルコード

using System;
namespace object_interface
{
  // 車のインターフェース
    public interface Icar
    {
        void runCar(string address);
    }
}
using System;
namespace object_interface
{
  // 自転車のインターフェース
    public interface IBicycle
    {
        void runBicycle(string address);
    }
}
using System;
namespace object_interface
{
  // Driveクラス(ICar、IBicycleクラスを実装)
    public class Drive : Icar, IBicycle
    {
      //名前
        private string _name;

      // 目的地
        private string _destinationAddress;

      // コンストラクタ(名前と目的地を設定)
        public Drive(string name, string destinationAddress)
        {
            _name = name;
            _destinationAddress = destinationAddress;
        }

   // ICarクラスを実装
        public void runCar(string address)
        {
            Console.WriteLine(_name + "が自動車で" + address + "から" + _destinationAddress + "に向けて走ります。");
        }
      // IBicycleクラスを実装
        public void runBicycle(string address)
        {
            Console.WriteLine(_name + "が自転車で" + address + "から" + _destinationAddress + "に向けて走ります。");
        }
    }
}

using System;

namespace object_interface
{
    class Program
    {
        static void Main(string[] args)
        {
          // Driveクラスのインスタンスを生成
            Drive drive = new Drive("田中太郎", "東京");

            drive.runCar("福岡");
            drive.runBicycle("北海道");

            Icar car = (Icar)drive;
            car.runCar("大阪");

            IBicycle bicycle = (IBicycle)drive;
            bicycle.runBicycle("愛知");
        }
    }
}

 

実行結果:
田中太郎が自動車で福岡から東京に向けて走ります。
田中太郎が自転車で北海道から東京に向けて走ります。
田中太郎が自動車で大阪から東京に向けて走ります。
田中太郎が自転車で愛知から東京に向けて走ります。

 

上記のように、インターフェース内で定義されたメソッドをクラスで実装する必要があります。

ただし、インターフェースには、メソッドの実装やフィールドを持つことはできません。

また、今回はインターフェースに「public」をつけています。
しかし、インターフェースのメソッドはすベて「public」であることが前提のため省略されることもあります。

最後に、継承との違いとして、下記のようにインターフェースは複数実装することができます。

public class Drive : Icar, IBicycle
{
}

 

おすすめ・参考書籍

■C#を学習し始めた方向け
やさしいC 第3版 (「やさしい」シリーズ)

1週間でCの基礎が学べる本

確かな力が身につくC「超」入門 第2版 (Informatics&IDEA)

■C#をある程度学習した方向け
基礎からしっかり学ぶCの教科書 改訂新版 (マイクロソフト関連書)

独習C 新版

Effective C 6.0/7.0

オブジェクト指向における再利用のためのデザインパターン