MST

星途 面试题库

面试题:C#中接口与抽象类在成员定义上的主要区别

请详细阐述C#中接口与抽象类在成员定义方面(如方法、属性等)存在哪些主要区别。
23.9万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

1. 方法定义

  • 抽象类
    • 抽象类可以包含抽象方法和非抽象方法。抽象方法只有声明,没有实现,必须在抽象类中定义且由子类重写。例如:
public abstract class AbstractClass
{
    public abstract void AbstractMethod();
    public void NonAbstractMethod()
    {
        Console.WriteLine("This is a non - abstract method.");
    }
}
  • 接口
    • 接口中的所有方法都是抽象的,且不能包含方法的实现。方法默认是 publicabstract 的,定义时无需显式声明。例如:
public interface IMyInterface
{
    void InterfaceMethod();
}

2. 属性定义

  • 抽象类
    • 抽象类可以有普通属性和抽象属性。普通属性和一般类中的属性一样,有完整的 getset 访问器实现。抽象属性只有声明,其实现由子类提供。例如:
public abstract class AbstractClassWithProperty
{
    public int NormalProperty { get; set; }
    public abstract string AbstractProperty { get; set; }
}
  • 接口
    • 接口中的属性只能是抽象的,且不提供访问器的实现。与方法类似,属性默认是 publicabstract 的。例如:
public interface IInterfaceWithProperty
{
    string InterfaceProperty { get; set; }
}

3. 成员修饰符

  • 抽象类
    • 抽象类中的成员可以使用各种访问修饰符,如 publicprivateprotected 等。抽象方法通常使用 publicprotected 修饰,以便子类能够访问并实现它们。例如:
public abstract class AbstractClassWithModifiers
{
    private int privateField;
    protected abstract void ProtectedAbstractMethod();
}
  • 接口
    • 接口成员默认是 public 的,不允许显式指定其他访问修饰符。因为接口的目的是提供一种通用的契约,所有实现接口的类都必须以公开的方式实现接口成员。例如,以下代码是错误的:
// 错误示例,接口成员不能指定非public修饰符
public interface IInvalidInterface
{
    private void InvalidMethod(); 
}

4. 成员实现的强制要求

  • 抽象类
    • 继承抽象类的非抽象子类必须实现抽象类中的所有抽象成员。但如果子类也是抽象类,则可以不实现抽象成员,将实现延迟到更具体的子类。例如:
public class SubAbstractClass : AbstractClass
{
    // 必须实现抽象方法
    public override void AbstractMethod()
    {
        Console.WriteLine("Implementation of AbstractMethod in SubAbstractClass.");
    }
}
  • 接口
    • 实现接口的类必须实现接口中的所有成员,除非该类本身也是抽象类。实现接口成员时,必须使用 public 修饰符,以匹配接口成员的默认访问级别。例如:
public class ImplementingClass : IMyInterface
{
    public void InterfaceMethod()
    {
        Console.WriteLine("Implementation of InterfaceMethod.");
    }
}

5. 成员默认值

  • 抽象类
    • 抽象类中的非抽象成员可以有默认值。例如,非抽象方法可以有方法体,普通属性可以有默认的 getset 实现。
  • 接口
    • 接口成员不能有默认值,因为接口只是定义契约,不包含任何实现细节。