继承之虚方法和重写方法知识点和思考练习
知识点
(三)虚方法和重写方法
1、虚方法
面向对象编程中,有一个重要特性,即多态性。多态性是指同一操作作用于不同类的实例,不同类对其进行不同的解释,从而产生不同的结果。C#支持两种类型的多态:
1)编译时多态。可以通过重载实现,优点是运行速度快。
2)运行时多态。是指直到运行时才根据具体情况采取具体措施,C#中通过虚方法来实现运行时多态,优点是灵活度高和抽象。
基类的虚方法通过关键字virtual进行定义,且允许在派生类中重写这些方法,即此方法可以被任何继承它的类重写。声明方法如下:
访问修饰符 virtual 返回类型 方法名称(参数列表)
{
虚方法实现部分
}
virtual 不能和static、abstract、override修饰符一起使用。
2、重写方法
实例中通过override关键字修饰的方法称为重写方法。重写方法必须与继承来的虚方法具有相同的名称。只有在基类中使用关键字virtual修饰的虚方法才可以在派生类中重写其实现。默认情况下,C#方法属于非virtual类型,不能重新。
即使用基类定义对象,当被派生类对象赋值后,也会被调用对应的重写的虚拟方法。
思考练习
using System; namespace VirtualOverride { public class Dimension { protected double x, y; protected const double PI = Math.PI; public Dimension(double xVar, double yVar) { x = xVar; y = yVar; } public virtual double Area() { return x * y; } } public class Circle : Dimension { public Circle(double r) : base(r, 0) { } public override double Area() { return x * x * Dimension.PI; } } public class Sphere : Dimension { public Sphere(double a, double b) : base(a, b) { } public override double Area() { return x * y * PI; } } public class Program { static void Main() { Circle circle1 = new Circle(7); Console.WriteLine("Circle's area is {0}", circle1.Area()); Sphere sphere1 = new Sphere(6, 7); Console.WriteLine("Sphere's area is {0}", sphere1.Area()); Console.ReadLine(); Dimension dimension1;//即使用基类定义对象,当被派生类对象赋值后,也会被调用对应的重写的虚拟方法 //通过上面和下面的语句发现,一个对象声明时,可以先不用new创建,也可通过下面的语句进行初始化,赋一个同类的对象或派生类的对象。 dimension1 = circle1; Console.WriteLine("dimension1's area is {0}", dimension1.Area()); Console.ReadLine(); } } }