C#에서 다형성의 정의는 다음과 같습니다. 동일한 작업이 서로 다른 클래스의 인스턴스에 적용되고, 서로 다른 클래스가 이를 다르게 해석하여 최종적으로 서로 다른 실행 결과를 생성합니다. 즉, 하나의 인터페이스, 여러 기능입니다.
C#은 두 가지 형태의 다형성을 지원합니다: 컴파일 시간 다형성, 런타임 다형성
컴파일 시간 다형성:
컴파일 시간 다형성은 오버로딩을 통해 달성됩니다
메서드 오버로딩
동일한 범위에서 동일한 함수 이름에 대한 여러 정의를 가질 수 있습니다. 함수 정의는 매개변수 목록의 매개변수 유형이나 매개변수 수에 따라 서로 달라야 합니다. 반환 유형만 다른 함수 선언은 오버로드될 수 없습니다. 예제 작성
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class exchange //定义一个exchange类 {//方法实现交换两参数数据 public void swap(int a, int b) { int temp; temp = a; a = b; b = temp; Console.WriteLine("{0},{1}",a,b); } public void swap(string a, string b) { string temp; temp = a; a = b; b = temp; Console.WriteLine("{0},{1}", a, b); } } class program { static void Main(string[] args) { exchange exch = new exchange(); exch.swap(10, 20); //调用 swap(int a,int b)方法 exch.swap("大", "小"); //调用 swap(string a,string b)方法 } } }
결과:
연산자 오버로딩
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class student //定义student类 { private int Chinese; private int Math; public void value(int a, int b) //定义一个赋值的方法,以后学了构造方法就不这么麻烦了 { Chinese = a; Math = b; } public static student operator + (student a, student b) //运算符重载,实现相加功能 { student stu = new student(); stu.Chinese = a.Chinese + b.Chinese; stu.Math = a.Math + b.Math; return stu; } public int getChinese() //获取Chinese 的方法 { return Chinese; } public int getMath() //获取Math 的方法 { return Math; } } class program { static void Main(string[] args) { student a = new student(); student b = new student(); a.value(70,80); b.value(40, 50); student stu = a + b; //70+40, 80+50 Console.WriteLine("a+b Chinese = {0}\na+b Math = {1}", stu.getChinese(), stu.getMath()); } } }
결과:
런타임 다형성:
런타임 다형성은 시스템이 실행될 때까지 실제 상황에 따라 어떤 작업을 구현할지 결정되지 않는다는 의미입니다. C#의 런타임 다형성은 추상 클래스를 통해 구현되거나 다음을 사용하여 구현됩니다. 가상 방법.
추상 클래스 및 추상 메서드
C#에서는 abstract 키워드를 사용하여 추상 클래스 또는 추상 메서드를 생성할 수 있습니다. 파생 클래스가 추상 클래스에서 상속되면 구현이 완료됩니다. 추상 클래스에는 파생 클래스에서 구현할 수 있는 추상 메서드가 포함되어 있습니다. 파생 클래스에는 보다 전문화된 기능이 있습니다. 추상 클래스는 인스턴스화할 수 없습니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test {//创建抽象类和抽象方法 abstract class score { public abstract int Add(); } //创建子类 class student : score { private int Chinese = 80; private int Math = 90; public override int Add() //关键字 override 实例方法 { int sum=Chinese+Math; return sum; } } class program { static void Main(string[] args) { student stu = new student(); Console.WriteLine(stu.Add() ); //结果 170 } } }
가상 메서드
가상 메서드는 virtual 키워드를 사용하여 선언됩니다. 가상 메서드는 상속된 클래스마다 다르게 구현될 수 있습니다. 가상 메서드에 대한 호출은 런타임에 발생합니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class score { protected int Chinese = 80; protected int Math = 90; public virtual int Add() //定义一个虚方法 { int sum = Chinese + Math; return sum; } } //定义子类,实现方法 class student : score { public override int Add() //关键字 override 实例方法,实现相减操作 { int sub = Math - Chinese ; return sub; } } class program { static void Main(string[] args) { student stu = new student(); Console.WriteLine(stu.Add() ); //结果 10 } } }
실제로 런타임에 호출되는 메소드는 가상 메소드가 아니고 재정의 인스턴스 이후의 메소드임을 알 수 있습니다
위는 C# 학습일지 23---다형성 연산자 오버로딩 , 메소드 오버로딩, 추상 클래스, 가상 메소드에 대한 자세한 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!