多态
- 静态多态
- 函数重载
- 运算符重载
- 动态多态
静态多态
在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C#
提供了两种技术来实现静态多态性。分别为:
函数重载
同名不同参
运算符重载
动态多态
C#
允许您使用关键字 abstract
创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可被派生类实现。派生类具有更专业的功能。
请注意,下面是有关抽象类的一些规则:
您不能创建一个抽象类的实例。
您不能在一个抽象类外部声明一个抽象方法。
通过在类定义前面放置关键字 sealed
,可以将类声明为密封类。当一个类被声明为 sealed
时,它不能被继承。抽象类不能被声明为 sealed
。
总之,
类前声明abstruct
就可以写出一个抽象类
当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法。
虚方法是使用关键字 virtual 声明的。
虚方法可以在不同的继承类中有不同的实现。
对虚方法的调用是在运行时发生的。
动态多态性是通过 抽象类 和 虚方法 实现的。
在C#(以及其他一些面向对象的编程语言中),override
是一个关键字,用于指示一个方法在派生类中覆盖了基类中的同名方法。这意味着,当你使用派生类的对象并调用这个方法时,将执行派生类中的版本,而不是基类中的版本。
要使用override
关键字,必须满足以下条件:
基类中存在一个虚方法(virtual)或抽象方法(abstract):基类中必须有一个具有相同签名(即相同的名称、参数列表和返回类型)的虚方法或抽象方法。
派生类继承自基类:包含override
方法的类必须是从包含被覆盖方法的类继承而来的。
方法签名匹配:派生类中的方法必须与基类中被覆盖的方法具有相同的签名。
访问修饰符不能比基类方法更严格:派生类中方法的访问修饰符(如public
、protected
或internal
)不能比基类中被覆盖的方法更严格。例如,如果基类中的方法是public
的,那么派生类中的覆盖方法也必须是public
的。
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();}}
}