C# ポリモフィズムのサンプル

C#のポリモフィズムのサンプルです。

目次

ポリモフィズム

  • メソッドの処理で使用するインスタンスによって処理が変わることです。
  • 例:複数のクラスで同じインターフェースを実装するとします。
  • あるメソッドの引数のデータ型にインターフェースを指定します。
    「メソッド名(データ型 変数)」←データ型にインターフェースを指定する
  • それによりメソッドの引数は、異なるクラスのインスタンスを指定できます。
    →引き渡すインスタンスによって処理の内容が変わります。

コード

ポリモフィズムのサンプルです。

using System;

namespace Project1
{
    public interface ItestA
    {
        void print1(); // 抽象メソッド
    }
    public class Class1 : ItestA
    {
        void ItestA.print1()
        {
            Console.WriteLine("123");
        }
    }
    public class Class2 : ItestA
    {
        void ItestA.print1()
        {
            Console.WriteLine("456");
        }
    }
    class TestA
    {
        static void Main()
        {
            Class1 c1 = new Class1();
            Class2 c2 = new Class2();

            exe01(c1); // 123
            exe01(c2); // 456
        }
        // 同じインターフェース型でアクセスできる
        public static void exe01(ItestA c)
        {
            c.print1();
        }
    }
}

9,16行目の2つのクラスは5行目のインターフェースを実装しています。
27行目は、Class1クラスをインスタンス化しています。
28行目は、Class2クラスをインスタンス化しています。
30,31行目は同じexe01メソッドを実行していますが出力される内容は異なります。
34行目の引数の型はインターフェース型になっています。

 

Listを使用して書き換える

上記のコードは、Listを使用して書き換えることができます。

using System;
using System.Collections.Generic;

namespace Project1
{
    public interface ItestA
    {
        void print1(); // 抽象メソッド
    }
    public class Class1 : ItestA
    {
        void ItestA.print1()
        {
            Console.WriteLine("123");
        }
    }
    public class Class2 : ItestA
    {
        void ItestA.print1()
        {
            Console.WriteLine("456");
        }
    }
    class TestA
    {
        static void Main()
        {
            List<ItestA> a = new List<ItestA>();

            a.Add(new Class1());
            a.Add(new Class2());

            foreach (ItestA b in a)
            {
                exe01(b); //123 456
            }
        }
        // 同じインターフェース型でアクセスできる
        public static void exe01(ItestA b)
        {
            b.print1();
        }
    }
}

30,31行目は、インスタンスをリストに追加しています。
33~36行目は、foreach文でループを回してメソッドを実行しています。同じインターフェースの型なので実行できます。

関連の記事

C# クラスの継承のサンプル
C# インターフェースのサンプル(interface)
C# 抽象クラスと抽象メソッドのサンプル(abstract)
C# Listのサンプル

△上に戻る