ポリモーフィズム

# ポリモーフィズムの種類

ポリモーフィズムは、操作を他の型の値にも適用できることを意味します。

ポリモーフィズムには複数のタイプがあります:

  • **アドホック ポリモーフィズム:**
    「関数のオーバーロード」が含まれています。目標は、ジェネリックである必要なく、異なる型でメソッドを使用できることです。
  • **パラメトリック ポリモーフィズム:**
    ジェネリック型の使用です。 [ジェネリック](http://stackoverflow.com/documentation/c%23/27/generics)を参照
  • **サブタイプ:**
    同様の機能を一般化するクラスのターゲット継承を持っている
  • # アドホック ポリモーフィズム

    Ad hoc polymorphism のターゲット 関数呼び出しまたはジェネリックで型変換を必要とせずに、さまざまなデータ型から呼び出すことができるメソッドを作成することです。次のメソッド sumInt(par1, par2) 異なるデータ型で呼び出すことができ、型の組み合わせごとに独自の実装があります:

    public static int sumInt( int a, int b)
    {
        return a + b;    
    }
    
    public static int sumInt( string a, string b)
    {
        int _a, _b;
        
        if(!Int32.TryParse(a, out _a))
            _a = 0;
        
        if(!Int32.TryParse(b, out _b))
            _b = 0;
        
        return _a + _b;
    }
    
    public static int sumInt(string a, int b)
    {
        int _a;
        
        if(!Int32.TryParse(a, out _a))
            _a = 0;    
        
        return _a + b;
    }
    
    public static int sumInt(int a, string b)
    {        
        return sumInt(b,a);
    }
    
    

    以下は呼び出しの例です:

    public static void Main()
    {
        Console.WriteLine(sumInt( 1 , 2 ));  //  3
        Console.WriteLine(sumInt("3","4"));  //  7
        Console.WriteLine(sumInt("5", 6 ));  // 11
        Console.WriteLine(sumInt( 7 ,"8"));  // 15
    }
    
    

    # サブタイピング

    サブタイプとは、基本クラスからの継承を使用して同様の動作を一般化することです:

    public interface Car{
        void refuel();
    }
    
    public class NormalCar : Car
    {
        public void refuel()
        {
            Console.WriteLine("Refueling with petrol");    
        }
    }
    
    public class ElectricCar : Car
    {
        public void refuel()
        {
            Console.WriteLine("Charging battery");    
        }
    }
    
    

    両方のクラス NormalCarElectricCar 現在、燃料を補給する方法がありますが、独自の実装があります。以下に例を示します:

    public static void Main()
    {
        List<Car> cars = new List<Car>(){
            new NormalCar(),
            new ElectricCar()
        };
        
        cars.ForEach(x => x.refuel());
    }
    
    

    出力は次のようになります:

    ガソリンの給油
    バッテリーの充電

    # 別のポリモーフィズムの例

    ポリモーフィズムは、OOP の柱の 1 つです。 Poly は、「複数のフォーム」を意味するギリシャ語に由来します。

    以下は、ポリモーフィズムを示す例です。クラス Vehicle 基本クラスとして複数の形式を取ります。

    派生クラス DucatiLamborghini Vehicle から継承 基本クラスの Display() をオーバーライドします メソッド、独自の NumberOfWheels を表示する .

    public class Vehicle
    {
        protected int NumberOfWheels { get; set; } = 0;
        public Vehicle()
        {
        }
    
        public virtual void Display()
        {
            Console.WriteLine($"The number of wheels for the {nameof(Vehicle)} is {NumberOfWheels}");
        }
    }
    
    public class Ducati : Vehicle
    {
        public Ducati()
        {
            NoOfWheels = 2;
        }
    
        public override void Display()
        {
            Console.WriteLine($"The number of wheels for the {nameof(Ducati)} is {NumberOfWheels}");
        }
    }
    
    public class Lamborghini : Vehicle
    {
        public Lamborghini()
        {
            NoOfWheels = 4;
        }
    
        public override void Display()
        {
            Console.WriteLine($"The number of wheels for the {nameof(Lamborghini)} is {NumberOfWheels}");
        }
    }
    
    

    以下は、ポリモーフィズムが示されているコード スニペットです。オブジェクトは基本型 Vehicle 用に作成されます 変数 vehicle を使用する 1 行目。基本クラスのメソッド Display() を呼び出します。 行 2 で、示されているように出力を表示します。

    
    static void Main(string[] args)
     {
        Vehicle vehicle = new Vehicle();    //Line 1
        vehicle.Display();                  //Line 2  
        vehicle = new Ducati();             //Line 3
        vehicle.Display();                  //Line 4
        vehicle = new Lamborghini();        //Line 5
        vehicle.Display();                  //Line 6
     }
    
    

    3 行目の vehicle オブジェクトは派生クラス Ducati を指しています Display() を呼び出します このメソッドは、次のように出力を表示します。オブジェクト vehicle タイプは Vehicle です 、派生クラス メソッド Display() を呼び出します タイプ Ducati として 基本クラス Display() をオーバーライドします メソッド、vehicle 以降 オブジェクトは Ducati を指しています .

    Lamborghini を呼び出す場合も同じ説明が適用されます。 タイプの Display() メソッド。

    出力を以下に示します

    The number of wheels for the Vehicle is 0        // Line 2 
    The number of wheels for the Ducati is 2         // Line 4
    The number of wheels for the Lamborghini is 4    // Line 6