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++
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
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