다형성은 C#과 같은 객체 지향 프로그래밍 언어에서 달성되는 개념으로, 연산자나 함수형 메서드는 실행 프로세스 전반에 걸쳐 두 가지 이상의 형식을 취할 수 있습니다. 프로그램에서 상속을 구현하는 데 널리 사용되며 이는 연산자 오버로딩과 함수 오버로딩의 두 가지 방법으로 분류됩니다. 다형성은 간단히 말해서 두 클래스가 서로 다른 속성을 갖는 파생 클래스를 사용하여 기본 클래스를 변경하는 기술로 설명할 수 있습니다.
다음 다이어그램은 다형성의 작동을 보여줍니다.
이 그림은 점토가 냄비, 그릇, 장난감 물건을 만드는 상위 개체임을 설명합니다. 이 사물들은 모두 서로 다르지만 점토의 성질을 갖고 있다. 이 세 가지 오브제는 같은 재료인 점토로 만들어졌음에도 모양이 다르고, 사용되는 방식도 다릅니다.
다음은 다형성의 두 가지 형태입니다.
연산자는 연산 중인 피연산자 유형에 따라 다양한 출력을 제공할 수 있습니다. 이를 연산자 오버로딩이라고 합니다. 예를 들어 연산자 '+'는 두 정수에 대한 덧셈을 수행할 수 있고 두 문자열을 연결할 수 있습니다. 따라서 동일한 연산자를 2가지 다른 방식으로 사용할 수 있습니다. 더하기 연산자는 일반적으로 두 개의 숫자를 더합니다. 그러나 복소수의 경우 덧셈이 조금 달라 해당 실수부와 허수부가 별도로 덧셈됩니다. 다음은 '+' 연산자를 오버로드하여 복소수를 더하는 방법을 보여주는 예제 코드입니다.
코드:
using System; namespace Overload { class Complex { public double x; public double y; // no-argument constructor public Complex() {} // parameterized constructor public Complex(double real, double img) { x = real; y = img; } // Overloading of Binary "+" operator public static Complex operator + (Complex c1, Complex c2) { Complex c3 = new Complex(); c3.x = c1.x + c2.x; c3.y = c1.y + c2.y; return c3; } // function to display result public void display() { Console.WriteLine("{0} + {1}i", x,y); } } class CalNum { // Driver Code static void Main(string[] args) { Complex num1 = new Complex(2.5,3.5); Complex num2 = new Complex(1.2,6.5); Complex num3 = num1 + num2; Console.Write("c1 = "); num1.display(); Console.Write("c2 = "); num2.display(); Console.Write("c3 = "); num3.display(); } } }
출력:
이 출력은 두 개의 복소수를 더하기 위한 연산자 오버로드를 보여줍니다. 코드는 연산자 오버로딩과 함수 오버로딩을 보여줍니다.
함수는 매개변수 수, 반환 유형, 함수 반환 유형에 따라 다양한 출력을 제공할 수 있습니다. 위에서 언급한 코드는 생성자를 사용한 함수 오버로드도 다룹니다. 코드에는 2개의 생성자가 있습니다. 하나는 비어 있는 기본 생성자이고 다른 하나는 매개변수로 언급된 값으로 복소수를 초기화하는 데 사용되는 매개변수화된 생성자입니다.
그림에 표시된 예를 보면 기능은 점토를 성형하는 것이고 스트로크 방향은 점토를 성형하기 위해 제공되는 부재입니다. 획의 방향에 따라 점토는 각각 냄비, 그릇, 장난감으로 변신합니다.
코드:
using System; using System.Collections.Generic; public class Clay { // A few example members public int Height { get; set; } public int strokeDirection { get; set; } // Virtual method public virtual void Mould() { Console.WriteLine("Beginning to mould the clay"); } } class Pot : Clay { public override void Mould() { // Code to make a pot Console.WriteLine("Making a pot"); base.Mould(); } } class Bowl : Clay { public override void Mould() { // Code to make a bowl Console.WriteLine("Making a bowl"); base.Mould(); } } class Toy : Clay { public override void Mould() { // Code to make a toy Console.WriteLine("Making a toy"); base.Mould(); } } class Program { static void Main(string[] args) { // Illustrating Polymorphism #1: a Pot, Bowl and Toy // can all be used wherever Clay is expected. No cast is // needed because an implicit conversion exists from a derived // class to its base class. var items = new List<Clay> { new Pot(), new Bowl(), new Toy() }; // Polymorphism at work #2: the virtual method Mould is // invoked on each of the derived classes, not the base class. foreach (var item in items) { item.Mould(); } } }
출력:
코드에서 언급했듯이 Clay 클래스는 하위 클래스가 냄비, 장난감, 그릇 클래스인 상위 클래스입니다. 'Mould' 메소드는 동일한 함수 시그니처를 사용하여 상위 클래스와 하위 클래스에 정의됩니다. 따라서 자식 클래스의 개체가 생성되고 Mould 메서드를 호출하면 기본 클래스 메서드가 자식 클래스 메서드로 재정의됩니다. 따라서 하위 클래스 메서드의 출력이 표시됩니다. 위 코드는 다형성을 설명하기 위해 오버로딩이 아닌 메소드 오버라이딩을 보여줍니다.
C#의 다형성에 대해 염두에 두어야 할 사항:
다음은 몇 가지 핵심 사항입니다.
위 내용은 C#의 다형성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!