面试题答案
一键面试接口(Interface)
- 应用方式:一个类可以实现多个接口,从而实现类似多继承的效果。接口只定义方法签名,不包含方法的实现。
// 定义接口
public interface IPrintable
{
void Print();
}
public interface IStorable
{
void Store();
}
// 类实现接口
public class Document : IPrintable, IStorable
{
public void Print()
{
Console.WriteLine("Document is printing.");
}
public void Store()
{
Console.WriteLine("Document is stored.");
}
}
- 优势:
- 灵活性高:一个类可以实现多个接口,提供了更灵活的功能组合。
- 解耦性好:接口使用者只关心接口定义,不关心实现细节,便于代码的维护和扩展。
- 实现多继承:C# 不支持类的多继承,但通过接口可以实现类似多继承的功能。
- 权衡因素:
- 无状态存储:接口不能包含字段,无法存储状态信息,所有实现类必须自行管理状态。
- 实现重复:不同类实现相同接口时,可能会出现重复代码。
抽象类(Abstract Class)
- 应用方式:抽象类可以包含抽象方法和非抽象方法,抽象方法必须由子类实现,非抽象方法子类可以直接使用。子类只能继承一个抽象类。
// 定义抽象类
public abstract class Shape
{
public abstract double Area();
public void Display()
{
Console.WriteLine($"The area of the shape is {Area()}");
}
}
// 子类继承抽象类
public class Circle : Shape
{
private double radius;
public Circle(double radius)
{
this.radius = radius;
}
public override double Area()
{
return Math.PI * radius * radius;
}
}
- 优势:
- 代码复用:抽象类可以包含非抽象方法,供子类复用,减少代码重复。
- 包含状态:可以包含字段,用于存储和管理子类共享的状态。
- 定义通用行为:抽象类定义了一组相关类的通用行为和属性,便于代码的组织和维护。
- 权衡因素:
- 单继承限制:C# 中一个类只能继承一个抽象类,限制了继承的灵活性。
- 耦合度较高:子类与抽象类耦合度较高,抽象类的修改可能影响到所有子类。
总结
在实现多继承相关功能时,如果需要实现多个不相关的功能组合,接口是更好的选择;如果需要定义一组相关类的通用行为和状态,并实现代码复用,抽象类更为合适。通常在实际开发中,会根据具体需求综合使用接口和抽象类,以达到最佳的设计效果。