C# 第五章『面向对象』◆第7节:多态

         通过继承实现的不同对象调用相同的方法,表现出不同的行为,成为多态。C#中的每种类型都是多态的。当派生类从基类继承时,它会获得基类所有方法、字段、属性和事件。面向对象的语言适用虚方法表达多态。

       多态是面向对象程序设计的基本特征之一,它使得派生类的实例可以直接赋予基类的对象,然后直接通过这个对象调用派生类的方法。在C#中,类的多态性是通过在派生类中重写基类的虚方法实现的。

        在C#中,方法在默认情况下不是虚拟的,但(除构造函数外)可以显式地声明为virtual,在方法前面加上virtual关键字,则称该方法为虚方法。将方法定义为虚方法后,可以在派生类中重写虚方法。重写虚方法需要使用override关键字,这样在调用方法时,可以调用对象类型的相应方法。

        备注:类中的成员字段和静态方法不能声明为virtual,因为virtual只对类中的实例函数和属性有意义。

        注意点:

  • 覆写和被覆写的方法必须有相同的可访问性。
  • 不能覆写static方法或非虚方法。
  • 方法、属性和索引器,以及另一种成员类型:事件,都可以被声明为virtual和override。
class MyBaseClass//基类
{
    virtual public void Print()
}
class MyDerivedClass:MyBaseClass//派生类
{
    override public void Print()
}
//---------------------------------------override和public的位置可以互换

public virtual void Test()
{
    Console.WriteLine("虚方法");
}
public override void Test()
{
    Console.WriteLine("虚方法重写");
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _20220806_1
{
        public class Rectangle
        {
            protected double a, b;
            public Rectangle()
            {
            }
            public Rectangle(double a,double b)
            {
                this.a = a;
                this.b = b;
            }
            public virtual double Area()
            {
                return a * b;
            }
        }
        public class Cylinder:Rectangle
        {
            public Cylinder(double h,double r):base(h,r)
            {
            }
            public override double Area()
            {
                //return base.Area();
                return 2 * Math.PI * b * b + 2 * Math.PI * a * b;
            }
        }
    class Program
    {
        static void Main(string[] args)
        {
            Rectangle r = new Rectangle(1, 10);
            Cylinder c = new Cylinder(4, 2);
            Console.WriteLine("矩形面积:{0}", r.Area());
            Console.WriteLine("圆柱体表面积:{0}", c.Area());
            Console.ReadLine();
        }
    }
}
using System;

namespace Demo
{
    class Vehicle
    {
        string name;                            //定义字段
        public string Name                      //定义属性为字段赋值
        {
            get { return name; }
            set { name = value; }
        }
        public virtual void Move()              //定义方法输出交通工具的形态
        {
            Console.WriteLine("{0}都可以移动", Name);
        }
    }
    class Train : Vehicle
    {
        public override void Move()             //重写方法输出交通工具形态
        {
            Console.WriteLine("{0}在铁轨上行驶", Name);
        }
    }
    class Car : Vehicle
    {
        public override void Move()             //重写方法输出交通工具形态
        {
            Console.WriteLine("{0}在公路上行驶", Name);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Vehicle vehicle = new Vehicle();        //创建Vehicle类的实例
            Train train = new Train();              //创建Train类的实例
            Car car = new Car();                //创建Car类的实例
                                                //使用基类和派生类对象创建Vehicle类型数组
            Vehicle[] vehicles = { vehicle, train, car };
            vehicle.Name = "交通工具";          //设置交通工具的名字
            train.Name = "火车";              //设置交通工具的名字
            car.Name = "汽车";                    //设置交通工具的名字
            vehicles[0].Move();                 //输出交通工具的形态
            vehicles[1].Move();                 //输出交通工具的形态
            vehicles[2].Move();                 //输出交通工具的形态
            Console.ReadLine();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45336030/article/details/126186603