수색…
또 다른 다형성 예제
다형성은 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}");
}
}
아래는 다형성이 나타나는 코드 스 니펫입니다. 객체는 기본 유형에 대해 생성된다 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
}
Line 3에서 vehicle
객체는 Ducati
파생 클래스를 가리키고 Display()
메서드를 호출합니다.이 메서드는 표시된대로 출력을 표시합니다. 여기 다형성 (polymorphic)가 오는 객체에도 불구하고 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());
}
출력은 다음과 같습니다.
휘발유로 재급유
배터리 충전 중