수색…


또 다른 다형성 예제

다형성은 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}");
    }
}

아래는 다형성이 나타나는 코드 스 니펫입니다. 객체는 기본 유형에 대해 생성된다 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");    
    }
}

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