继承之虚方法和重写方法知识点和思考练习

知识点

 

(三)虚方法和重写方法
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();
        }
    }
}
posted on 2009-09-23 21:34  友闻语上  阅读(347)  评论(0编辑  收藏  举报