C#中的重写与多态知识点整理(刘铁锰老师课堂笔记)

发布时间 2023-07-24 14:50:58作者: Jack-sparrow

在C#中,重写(Override)和多态(Polymorphism)是面向对象编程中的重要概念。通过重写和多态,我们可以更好地组织和管理代码,提高代码的可维护性和可扩展性。

重写(Override)

重写是指在派生类中重新实现基类中已经定义的方法。通过重写一个方法,我们可以为派生类中的该方法提供新的实现,同时让程序在运行时动态地选择调用哪个实现。

多态(Polymorphism)

多态是指一个对象可以具有多种形态。在面向对象编程中,多态性允许我们通过一个基类引用来操作不同的派生类对象,从而提供更大的灵活性。
在C#中,要重写一个方法,需要满足以下条件:

  • 基类中该方法必须标记为virtual、abstract或override。
  • 派生类中要重写的方法必须使用override关键字进行标记。
  • 重写方法的签名(包括方法名、参数类型和返回类型)必须与基类中被重写的方法一致。

下面是两个简单的示例,演示了如何重写基类中的方法:
例1:

		class program
	{
		static void Main(string[] args)
		{
			var c = new Car();
			c.Run();
		}
	}

	class Vehicle
	{
		public virtual void Run()
		{
			Console.WriteLine("I'am running.");
			Console.ReadKey();
		}
	}

	class Car:Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Car is running!");
            Console.ReadKey();
        }
    }

在上面的例1中,Vehicle类定义了一个virtual方法Run(),而Car类通过override关键字重写了该方法。通过在Main()方法中创建Car的对象,并调用Run()方法,实现了子类Car对父类Vehicle方法的重写。
例2:

class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("The animal makes a sound");
    }
}

class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("The cat meows");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("The dog barks");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Animal animal1 = new Animal();
        Animal animal2 = new Cat();
        Animal animal3 = new Dog();

        animal1.MakeSound(); // 输出:"The animal makes a sound"
        animal2.MakeSound(); // 输出:"The cat meows"
        animal3.MakeSound(); // 输出:"The dog barks"
    }
}

在上面的例2中,Animal类定义了一个virtual方法MakeSound(),而Cat和Dog类通过override关键字重写了该方法。通过在Main()方法中创建不同的对象,并调用它们的MakeSound()方法,实现了多态性。

在上述例2中,Animal类充当了基类,而Cat和Dog类则是基类的派生类。通过声明一个Animal类型的引用,我们可以将其指向Cat或Dog类的对象,这正是多态的体现。

多态性的一个重要特点是在运行时确定调用哪个方法的实现,而不是在编译时确定。这种动态绑定的特性使得我们可以根据具体的对象类型来执行相应的代码,从而实现更灵活和可扩展的程序结构。

综上所述,C#中的重写和多态是实现面向对象编程的重要机制。通过重写方法,我们可以为派生类提供新的实现。而多态性允许我们使用基类引用来操作派生类对象,提供了更大的灵活性和可扩展性。