- 实例化类对象实现多态性:
- 在C#中,可以通过以下方式实例化类对象来实现多态性:
// 实例化基类对象
Animal animal1 = new Animal();
animal1.Name = "Generic Animal";
// 实例化派生类Dog的对象
Animal dog = new Dog();
dog.Name = "Buddy";
// 实例化派生类Cat的对象
Animal cat = new Cat();
cat.Name = "Whiskers";
- 这里使用基类类型的变量来引用派生类的实例,从而实现多态性。
- 方法调用的原理和执行过程:
- 原理:C# 中的方法调用遵循“晚期绑定”(Late Binding)原则,也称为运行时多态性。当通过基类类型的变量调用重写的方法时,实际调用的方法版本取决于对象的实际类型(即实例化时的类型),而不是变量的声明类型。
- 执行过程:
- 当代码执行到
dog.Speak()
时,虽然dog
变量声明为Animal
类型,但实际对象是Dog
类型。CLR(公共语言运行时)会在运行时检查dog
所引用对象的实际类型(Dog
),然后调用Dog
类中重写的Speak
方法。
- 同理,当执行
cat.Speak()
时,CLR 会检查到cat
实际引用的是Cat
类型的对象,从而调用Cat
类中重写的Speak
方法。
- 以下是完整的代码示例:
using System;
public class Animal
{
public string Name { get; set; }
public virtual void Speak()
{
Console.WriteLine($"{Name} makes a sound.");
}
}
public class Dog : Animal
{
public override void Speak()
{
Console.WriteLine($"{Name} barks.");
}
}
public class Cat : Animal
{
public override void Speak()
{
Console.WriteLine($"{Name} meows.");
}
}
class Program
{
static void Main()
{
Animal animal1 = new Animal();
animal1.Name = "Generic Animal";
animal1.Speak();
Animal dog = new Dog();
dog.Name = "Buddy";
dog.Speak();
Animal cat = new Cat();
cat.Name = "Whiskers";
cat.Speak();
}
}
- 在上述代码中,
Animal
类的Speak
方法被声明为virtual
,表示它可以被派生类重写。Dog
和Cat
类通过override
关键字重写了Speak
方法。当通过Animal
类型的变量调用Speak
方法时,实际执行的是对应派生类中重写的版本,这就是多态性的体现。