MST

星途 面试题库

面试题:C# 中虚方法、抽象方法与接口方法在类继承中的特性与差异

在C#面向对象编程中,虚方法、抽象方法和接口方法都与类的继承机制紧密相关。请详细说明这三种方法在声明、实现、重写要求以及使用场景上的特性与差异。并举例说明何时应选择使用虚方法,何时应使用抽象方法,何时该使用接口方法。
42.0万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

声明特性

  1. 虚方法:在基类的方法声明前使用 virtual 关键字。例如:
public class BaseClass
{
    public virtual void VirtualMethod()
    {
        Console.WriteLine("This is a virtual method in BaseClass.");
    }
}
  1. 抽象方法:在抽象类中使用 abstract 关键字声明,且方法没有实现体。例如:
public abstract class AbstractClass
{
    public abstract void AbstractMethod();
}
  1. 接口方法:在接口中定义方法,接口方法默认是 publicabstract 的,无需额外修饰符。例如:
public interface IMyInterface
{
    void InterfaceMethod();
}

实现特性

  1. 虚方法:基类中有默认实现,派生类可选择重写。
  2. 抽象方法:抽象类中无实现,必须在非抽象的派生类中实现。
  3. 接口方法:接口本身无实现,实现类必须为所有接口方法提供实现。

重写要求

  1. 虚方法:派生类使用 override 关键字重写,重写方法的访问修饰符可以与基类不同,但访问级别不能低于基类方法。
public class DerivedClass : BaseClass
{
    public override void VirtualMethod()
    {
        Console.WriteLine("This is the overridden virtual method in DerivedClass.");
    }
}
  1. 抽象方法:派生类必须使用 override 关键字重写。
public class ConcreteClass : AbstractClass
{
    public override void AbstractMethod()
    {
        Console.WriteLine("This is the implementation of abstract method in ConcreteClass.");
    }
}
  1. 接口方法:实现类必须实现接口方法,实现方法必须是 public 的。
public class ImplementingClass : IMyInterface
{
    public void InterfaceMethod()
    {
        Console.WriteLine("This is the implementation of interface method in ImplementingClass.");
    }
}

使用场景特性

  1. 虚方法:适用于基类有默认实现,而派生类可能需要根据自身情况对该实现进行修改的场景。例如,在图形绘制系统中,基类 Shape 有一个 Draw 虚方法,不同的形状如 CircleRectangle 可以重写 Draw 方法来实现自己的绘制逻辑。
  2. 抽象方法:当基类无法提供有意义的默认实现,且所有派生类都必须提供自己的实现时使用。例如,在一个游戏角色系统中,抽象类 Character 可能有抽象方法 Attack,具体的角色类如 WarriorMage 必须实现 Attack 方法来定义自己的攻击行为。
  3. 接口方法:用于实现多态性,当多个不相关的类需要实现一组相同的行为时使用。例如,Bird 类和 Plane 类都可以实现 IFlyable 接口,以提供 Fly 方法的实现,这样它们都具有飞行的行为,尽管它们的继承体系不同。