多态性的核心:不同类的对象可以以一致的方式调用相同的方法.
多态性的实现方式通常依赖于以下2个关键要素:
1. 继承和基类/派生类关系: 多态性通常基于继承关系,其中一个类可以从另一个类继承属性和 方法。这一层级关系包括一个基类(父类)和一个或多个派生类(子类)。
2. 方法的重写:多态性依赖于子类能够重写基类中的方法。重写是指在派生类中提供与基类中同名的方法,但具有不同的实现。这使得对象可以根据其实际类型来调用正确的方法。
允许派生类重写方法的机制有以下几种:
-
虚方法(Virtual Method):在基类中声明方法时,使用关键字"virtual"。虚方法可以在派生类中被重写。当通过基类类型的引用调用方法时,根据对象的实际类型来决定调用的是基类中的方法还是派生类中重写的方法。
-
抽象方法(Abstract Method):在抽象类中声明方法时,使用关键字"abstract"。抽象方法没有实现,只有方法的声明。派生类必须实现(重写)基类中的抽象方法。
-
接口(Interface):接口定义了一组方法的规范。类可以实现一个或多个接口,并提供接口中定义的方法的具体实现。通过实现相同的接口,不同的类可以提供自己的实现。
每种机制都允许派生类重写方法,以实现不同的行为。它们在语法和使用上有所不同,适用于不同的场景和需求。
派生类重写方法时,需要使用关键字"override"来标记方法。同时,虚方法和抽象方法需要在基类中声明,才能在派生类中进行重写。
多态实现步骤:
-
创建一个基类(父类):定义一个基类,并在其中声明方法或属性。这个基类将作为多态性的基础。
-
在基类中声明虚方法(Virtual Method):将希望在派生类中重写的方法声明为虚方法。在基类方法声明前添加关键字"virtual"。
//定义父类Shape public class Shape { //使用关键字virtual 声明虚方法 public virtual void Draw() { Console.WriteLine("Drawing a shape"); } }
-
创建派生类(子类):创建派生类并继承基类。在派生类中重写基类中的虚方法。在派生类方法声明前添加关键字"override"。
public class Circle : Shape { // 重写override 父类中的方法 public override void Draw() { Console.WriteLine("Drawing a circle"); } } public class Square : Shape { // 重写override 父类中的方法 public override void Draw() { Console.WriteLine("Drawing a square"); } }
-
使用多态性:创建基类或派生类的对象,并将其赋值给基类类型的变量或接口类型的引用。通过这些变量或引用调用方法时,实际上会调用对应的派生类中的重写方法。
Shape shape1 = new Circle(); Shape shape2 = new Square(); //使用基类的引用来引用派生类的对象,然后调用相同的方法 shape1.Draw(); // 调用 Circle 类的 Draw 方法, Drawing a circle shape2.Draw(); // 调用 Square 类的 Draw 方法, Drawing a square
这就是多态性的核心概念,允许以一致的方式处理不同类的对象