MST

星途 面试题库

面试题:C#中接口与抽象类在实现多态上的区别

请阐述在C#中,接口和抽象类在实现多态机制方面有哪些不同点?并结合简单代码示例说明。
28.5万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试
  1. 定义和基本特性
    • 抽象类
      • 可以包含抽象方法和具体方法。抽象方法只有声明,没有实现,需要子类去实现;具体方法有方法体,可以直接被调用。
      • 抽象类不能被实例化,只能被继承。
      • 一个类只能继承一个抽象类。
    • 接口
      • 只能包含抽象成员(方法、属性、事件、索引器),所有成员默认是 publicabstract 的,不能有方法体。
      • 接口不能包含字段,不能有构造函数。
      • 一个类可以实现多个接口。
  2. 多态实现方式
    • 抽象类:通过继承抽象类,子类重写抽象类中的抽象方法来实现多态。
    • 接口:通过类实现接口,并实现接口中的所有成员来实现多态。
  3. 代码示例
    • 抽象类实现多态
// 定义抽象类
abstract class Shape
{
    // 抽象方法
    public abstract double Area();
    // 具体方法
    public void PrintInfo()
    {
        Console.WriteLine($"这个形状的面积是: {Area()}");
    }
}

// 继承抽象类
class Circle : Shape
{
    private double radius;
    public Circle(double radius)
    {
        this.radius = radius;
    }

    // 重写抽象方法
    public override double Area()
    {
        return Math.PI * radius * radius;
    }
}

class Program
{
    static void Main()
    {
        Shape circle = new Circle(5);
        circle.PrintInfo();
    }
}
  • 接口实现多态
// 定义接口
interface IAreaCalculable
{
    double Area();
}

// 实现接口
class Rectangle : IAreaCalculable
{
    private double width;
    private double height;
    public Rectangle(double width, double height)
    {
        this.width = width;
        this.height = height;
    }

    // 实现接口方法
    public double Area()
    {
        return width * height;
    }
}

class Program
{
    static void Main()
    {
        IAreaCalculable rectangle = new Rectangle(4, 5);
        Console.WriteLine($"矩形的面积是: {rectangle.Area()}");
    }
}

在上述代码中,通过抽象类 Shape 和接口 IAreaCalculable 分别展示了不同的多态实现方式。抽象类 Shape 既可以有抽象方法 Area 供子类重写,也可以有具体方法 PrintInfo 供子类直接使用;而接口 IAreaCalculable 只定义了抽象的 Area 方法,由实现接口的类去具体实现。