サーチ…
別の多型の例
多型はOOPの柱の一つです。ポリはギリシャ語であり、複数形を意味しています。
以下は多型を示す例です。 Vehicle
クラスは、複数のフォームを基本クラスとして取ります。
DerivedクラスDucati
とLamborghini
は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}");
}
}
以下は、多型性が示されているコードスニペットです。オブジェクトは、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");
}
}
NormalCar
とElectricCar
両方のクラスには、現在、燃料補給の方法がありますが、独自の実装です。ここに例があります:
public static void Main()
{
List<Car> cars = new List<Car>(){
new NormalCar(),
new ElectricCar()
};
cars.ForEach(x => x.refuel());
}
出力は次のようになります。
ガソリンで燃料補給
バッテリーの充電