C# 다형성
다형성은 여러 형태를 갖는다는 뜻입니다. 객체 지향 프로그래밍 패러다임에서 다형성은 종종 "하나의 인터페이스, 다중 기능"으로 표현됩니다.
다형성은 정적일 수도 있고 동적일 수도 있습니다. 정적 다형성에서는 함수의 응답이 컴파일 타임에 발생합니다. 동적 다형성에서는 함수의 응답이 런타임에 발생합니다.
정적 다형성
컴파일 시 함수와 객체의 연결 메커니즘을 초기 바인딩, 정적 바인딩이라고도 합니다. C#은 정적 다형성을 구현하는 두 가지 기술을 제공합니다.
함수 오버로딩
연산자 오버로딩
연산자 오버로딩은 다음 장에서 논의할 것이고, 그런 다음 함수 오버로딩에 대해 논의할 것입니다.
함수 오버로딩
동일한 범위에서 동일한 함수 이름에 대한 정의가 여러 개 있을 수 있습니다. 함수 정의는 매개변수 목록의 매개변수 유형이나 매개변수 수에 따라 서로 달라야 합니다. 반환 유형만 다른 함수 선언은 오버로드될 수 없습니다.
다음 예에서는 다양한 데이터 유형을 인쇄하기 위한 여러 동일한 함수 print()를 보여줍니다.
using System; namespace PolymorphismApplication { class Printdata { void print(int i) { Console.WriteLine("Printing int: {0}", i ); } void print(double f) { Console.WriteLine("Printing float: {0}" , f); } void print(string s) { Console.WriteLine("Printing string: {0}", s); } static void Main(string[] args) { Printdata p = new Printdata(); // 调用 print 来打印整数 p.print(5); // 调用 print 来打印浮点数 p.print(500.263); // 调用 print 来打印字符串 p.print("Hello C++"); Console.ReadKey(); } } }
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.
Printing int: 5 Printing float: 500.263 Printing string: Hello C++
Dynamic Multi Morphic
C#을 사용하면 다음을 수행할 수 있습니다. 인터페이스의 부분 클래스 구현을 제공하는 추상 클래스를 만들려면 abstract 키워드를 사용하세요. 파생 클래스가 이 추상 클래스에서 상속되면 구현이 완료됩니다. 추상 클래스에는 파생 클래스로 구현할 수 있는 추상 메서드가 포함되어 있습니다. 파생 클래스에는 보다 전문화된 기능이 있습니다.
추상 클래스에 대한 몇 가지 규칙은 다음과 같습니다.
추상 클래스의 인스턴스를 만들 수 없습니다.
추상 클래스 외부에서는 추상 메서드를 선언할 수 없습니다.
클래스 정의 앞에 sealed 키워드를 배치하면 클래스를 sealed 클래스로 선언할 수 있습니다. 클래스가 sealed로 선언되면 상속될 수 없습니다. 추상 클래스는 봉인된 것으로 선언할 수 없습니다.
다음 프로그램은 추상 클래스를 보여줍니다.
using System; namespace PolymorphismApplication { abstract class Shape { public abstract int area(); } class Rectangle: Shape { private int length; private int width; public Rectangle( int a=0, int b=0) { length = a; width = b; } public override int area () { Console.WriteLine("Rectangle 类的面积:"); return (width * length); } } class RectangleTester { static void Main(string[] args) { Rectangle r = new Rectangle(10, 7); double a = r.area(); Console.WriteLine("面积: {0}",a); Console.ReadKey(); } } }
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.
Rectangle 类的面积: 面积: 70
클래스에 구현해야 하는 함수가 클래스에 정의되어 있는 경우 상속된 클래스의 경우 가상 메서드를 사용할 수 있습니다. 가상 메서드는 virtual 키워드를 사용하여 선언됩니다. 가상 메서드는 상속된 클래스마다 다르게 구현될 수 있습니다. 가상 메서드에 대한 호출은 런타임에 발생합니다.
동적 다형성은 추상 클래스 및 가상 메서드를 통해 구현됩니다.
다음 프로그램은 이를 보여줍니다.
using System; namespace PolymorphismApplication { class Shape { protected int width, height; public Shape( int a=0, int b=0) { width = a; height = b; } public virtual int area() { Console.WriteLine("父类的面积:"); return 0; } } class Rectangle: Shape { public Rectangle( int a=0, int b=0): base(a, b) { } public override int area () { Console.WriteLine("Rectangle 类的面积:"); return (width * height); } } class Triangle: Shape { public Triangle(int a = 0, int b = 0): base(a, b) { } public override int area() { Console.WriteLine("Triangle 类的面积:"); return (width * height / 2); } } class Caller { public void CallArea(Shape sh) { int a; a = sh.area(); Console.WriteLine("面积: {0}", a); } } class Tester { static void Main(string[] args) { Caller c = new Caller(); Rectangle r = new Rectangle(10, 7); Triangle t = new Triangle(10, 5); c.CallArea(r); c.CallArea(t); Console.ReadKey(); } } }
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.
Rectangle 类的面积: 面积:70 Triangle 类的面积: 面积:25