English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
다중 모드는 동일한 행동이 여러 가지 다른 표현 형태나 형태를 가지는 능력입니다.
다중 모드성다중 형태를 의미합니다. 객체 지향 프로그래밍 패러다임에서 다중 모드성은 '한 인터페이스, 여러 기능'으로 나타납니다.
다중 모드성은 정적이거나 동적일 수 있습니다. 다음은:정적 다중 모드성에서는 함수의 응답이 컴파일 시에 발생합니다. 다음은:动态多态性에서는 함수의 응답이 실행 시에 발생합니다.
C#에서는 모든 类型이 다중 모드적입니다. 이는 사용자 정의 类型을 포함한 모든 类型이 Object를 상속받기 때문입니다.
다중 모드는 동일한 인터페이스를 사용하여 다른 예제를 통해 다른 작업을 수행하는 것입니다. 그림에서 보면:
현실에서는 예를 들어 우리가 F1 키 이动作:
Flash 인터페이스에서 떠오르면 AS 3 의 도움말 문서;
현재 Word에서 떠오르면 Word 도움과 지원입니다;
Windows에서 떠오르는 것은 Windows 도움과 지원입니다.
같은 이벤트가 다른 객체에서 발생하면 다른 결과를 낳습니다.
컴파일 시에, 함수와 객체의 연결 기제는 이른 바인딩으로 불리며, 또한 정적 바인딩으로도 불립니다. C#은 정적 다중 모드성을 구현하기 위해 두 가지 기술을 제공합니다. 그 중 하나는 다음과 같습니다:
函数重载
연산자 오버로드
연산자 오버로드는 다음 장에서 논의될 것이며, 다음은 함수 오버로드에 대해 논의할 것입니다.
您可以在同一个范围内对相同的函数名有多个定义。函数的定义必须彼此不同,可以是参数列表中的参数类型不同,也可以是参数个数不同。不能重载只有返回类型不同的函数声明。
下面的示例演示了几个相同的函数 Add(),用于对不同个数参数进行相加处理:
using System; namespace PolymorphismApplication {}} public class TestData {}} public int Add(int a, int b, int c) {}} return a + b + c; } public int Add(int a, int b) {}} return a + b; } } class Program {}} static void Main(string[] args) {}} TestData dataClass = new TestData(); int add1 = dataClass.Add(1, 2); int add2 = dataClass.Add(1, 2, 3); Console.WriteLine("add1 :" + add1); Console.WriteLine("add2 :" + add2); } } }
下面的示例演示了几个相同的函数 print(),用于打印不同的数据类型:
using System; namespace PolymorphismApplication {}} class Printdata {}} void print(int i) {}} Console.WriteLine("输出整型: {0}", i ); } void print(double f) {}} Console.WriteLine("输出浮点型: {0}" , f); } void print(string s) {}} Console.WriteLine("输出字符串: {0}", s); } static void Main(string[] args) {}} Printdata p = new Printdata(); // 调用 print 来打印整数 p.print(1); // 调用 print 来打印浮点数 p.print(1.23); // 调用 print 来打印字符串 p.print("Hello w3codebox"); Console.ReadKey(); } } }
위의 코드가 컴파일 및 실행될 때, 다음과 같은 결과가 생성됩니다:
输出整型: 1 输出浮点型: 1.23 输出字符串: Hello w3codebox
C# 允许您使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。추상 클래스包含抽象方法,抽象方法可被派生类实现。派生类具有更专业的功能。
请注意,下面是有关抽象类的一些规则:
您不能创建一个抽象类的示例。
您不能在一个抽象类外部声明一个抽象方法。
通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。
下面的程序演示了一个抽象类:
using System; namespace PolymorphismApplication {}} abstract class Shape {}} abstract public 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 declare
가상 메서드는 다른 상속 클래스에서 다른 구현을 가질 수 있습니다.
가상 메서드 호출은 실행 시에 발생합니다.
동적 다중 상속은 다음과 같이 통해 추상 클래스 와 가상 메서드 구현된.
아래 예제는 Shape 기본 클래스를 생성하고 Circle, Rectangle, Triangle 파생 클래스를 생성합니다. Shape 클래스는 Draw라는 가상 메서드를 제공하며, 각 파생 클래스에서 이 메서드를 재정의하여 해당 클래스의 지정된 형상을 그립니다.
using System; using System.Collections.Generic; public class Shape {}} public int X { get; private set; } public int Y { get; private set; } public int Height { get; set; } public int Width { get; set; } // 가상 메서드 public virtual void Draw() {}} Console.WriteLine("기본 클래스의 그리기 작업을 수행합니다"); } } class Circle : Shape {}} public override void Draw() {}} Console.WriteLine("한 개의 원을 그립니다"); base.Draw(); } } class Rectangle : Shape {}} public override void Draw() {}} Console.WriteLine("한 개의 장方形을 그립니다"); base.Draw(); } } class Triangle : Shape {}} public override void Draw() {}} Console.WriteLine("한 개의 삼각형을 그립니다"); base.Draw(); } } class Program {}} static void Main(string[] args) {}} // List<Shape> 객체를 생성하고 해당 객체에 Circle, Triangle 및 Rectangle을 추가합니다 var shapes = new List<Shape> {}} new Rectangle(), new Triangle(), new Circle() }; // foreach 루프를 사용하여 해당 목록의 자식 클래스를 순회하며, 각 Shape 객체에 Draw 메서드를 호출합니다 foreach (var shape in shapes) {}} shape.Draw(); } Console.WriteLine("어떤 키든 누르시면 종료됩니다."); Console.ReadKey(); } }
위의 코드가 컴파일 및 실행될 때, 다음과 같은 결과가 생성됩니다:
장方形을 그립니다 기본 클래스의 그리기 작업을 수행합니다 삼각형을 그립니다 기본 클래스의 그리기 작업을 수행합니다 원형을 그립니다 기본 클래스의 그리기 작업을 수행합니다 어떤 키든 누르시면 종료됩니다.
아래 프로그램은虚 메서드 area()를 통해 다양한 형상 이미지의 면적을 계산하는 방법을 보여줍니다:
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