순서

I. Polymorphism(다형성)
II. Polymorphism Example


I. Polymorphism(다형성)

 

다형성은 같은 기능이지만 다르게 구현하는 객체지향 프로그래밍의 중요한 방식이다.

부모의 method를 상속받은 자식의 method에서 다시 정의하는 overriding 방법이다.

또한 자식 Class에 실행될 virtual method가 없을경우 상위 클래스를 탐색하여 실행한다.
(C++에서는 pure virtual method로 구현의 강제성을 띄게 할 수 있다.)

 


 

II. Polymorphism Example

 


 

1. Inheritance(상속)을 사용한 방법

 

using System;

namespace Polymorphism {
  class CDog {
    public string Name {
      get;
      set;
    }
    public virtual void bark() {
      Console.WriteLine($"{Name} Bark CDog");
    }
  }
  
  class CShiba : Dog {
    public override void bark() {
      Console.WriteLine($"{Name} bark CShiba");
    }
  }
  
  class CMain() {
    static void Main() {
      // Cshiba 메모리 생성 후 CDog을 가리키고 있음
      CDog shibDog = new CShiba();
      shibDog.Name = "Shib";
      shibDog.bark();
      ((CShiba)shibDog).bark(); 
    }
  }
}

Parents에서 virtual, Child에서 override로 함수를 선언해준다.
(C++에서는 양쪽에서 다 virtual)

Main()에서 new Cshiba()를 통해 가장 큰 메모리를 생성하고(상속 받았으므로)
CDog를 가리키며 변수에 저장하고 있다.

이때 method를 실행하면 Child method로 탐색하여 호출한다.

동일한 Parents Class에 여러 Child가 있다면 명시적으로 Casting 해줄 수 있다.

 

2. Abstract Class (추상클래스)를 이용한 방법

 

추상 메소드가 1개 이상이라면 반드시 추상 클래스로 정의된다.
추상 메소드는 부모Class에서 정의만 진행한다.
(C++의 순수 가상함수 같음...)

using System;

namespace Polymorphism {
  class abstract CDog { // 달라진 점
    public string Name {
      get;
      set;
    }
    public abstrct void bark(); // 달라진 점
  }
  
  class CShiba : Dog {
    public override void bark() {
      Console.WriteLine($"{Name} bark CShiba");
    }
  }
  
  class CMain() {
    static void Main() {
      // Cshiba 메모리 생성 후 CDog을 가리키고 있음
      CDog shibDog = new CShiba();
      shibDog.Name = "Shib";
      shibDog.bark();
      ((CShiba)shibDog).bark(); 
    }
  }
}

달라진 것은 virtual이 abstract가 되었고 class의 선언이 abstract class로 변경되었다.

'Programming > C#' 카테고리의 다른 글

[Programming][C#] 문법 6. Deep / Shallow Copy  (0) 2023.01.09
[Programming][C#] 문법 5. Struct  (0) 2023.01.09
[Programming][C#] 문법 3. Property  (0) 2023.01.08
[Programming][C#] 문법 2. Generic  (0) 2023.01.08

+ Recent posts