サーチ…


別の多型の例

多型はOOPの柱の一つです。ポリはギリシャ語であり、複数形を意味しています。

以下は多型を示す例です。 Vehicleクラスは、複数のフォームを基本クラスとして取ります。

DerivedクラスDucatiLamborghiniVehicleから継承し、基本クラスの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}");
    }
}

以下は、多型性が示されているコードスニペットです。オブジェクトは、Line 1で可変Vehicleを使用して基本タイプVehicle用に作成されますvehicleで基本クラスメソッドDisplay()を呼び出し、出力を表示します。

 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

多型のタイプ

多態性とは、演算を他の型の値に適用することもできます。

多型には複数のタイプがあります。

  • アドホック多型:
    function overloadingが含まれていfunction overloading 。目標は、メソッドがジェネリックでなくても異なるタイプで使用できるということです。
  • パラメトリック多型:
    ジェネリック型の使用です。 ジェネリックスを参照
  • サブタイプ:
    同様の機能を一般化するクラスを継承している

アドホック多型

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());
}

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

ガソリンで燃料補給
バッテリーの充電



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow