MST
星途 面试题库

面试题:C#类继承与对象多态实例化

假设有一个基类Animal,包含属性Name和方法Speak。再定义两个派生类Dog和Cat,分别重写Speak方法。请阐述如何在C#中正确地实例化这些类的对象,以实现多态性,并且说明在使用不同类型的变量引用这些对象实例时,方法调用的原理和执行过程。
16.3万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试
  1. 实例化类对象实现多态性
    • 在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";
  • 这里使用基类类型的变量来引用派生类的实例,从而实现多态性。
  1. 方法调用的原理和执行过程
    • 原理: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,表示它可以被派生类重写。DogCat类通过override关键字重写了Speak方法。当通过Animal类型的变量调用Speak方法时,实际执行的是对应派生类中重写的版本,这就是多态性的体现。