实现接口的c#抽象类

本文关键字:抽象类 接口 实现 | 更新日期: 2023-09-27 17:49:53

我看到了下面的代码布局阅读论坛和其他博客文章和改编,以提出一些问题。

public interface IService<T>
{
    int Add(T entity);
    void Update(T entity);
}
public abstract class ServiceBase<T> : IService<T>
{
    public int Add(T entity) { ... }
    public void Update(T entity) { ... }
}
public interface ICarService : IService<Car>
{
}
public class SomeBaseClass : ServiceBase<Car>, ICarService
{
    public int Add(Car entity);
    public void Update(Car entity);
}

我不明白的是用抽象类实现接口的好处。对我来说,它只是感觉有点重复,我不能理解用一个抽象类实现接口的好处。

  1. 为什么抽象类ServiceBase<T>不需要继承IService接口就直接定义?这是在重复代码吗?
  2. 为什么SomeBaseClass也要实现ICarService ?ServiceBase难道还不够吗?

实现接口的c#抽象类

Ad 1:附加的抽象基类允许您在不破坏实现的情况下发展接口。假设没有抽象基类,您将扩展接口,比如通过添加一个新方法。那么你的实现就被破坏了,因为你的类不再实现接口了。

使用一个额外的抽象基类,你可以把它分开:如果你给接口添加一个新方法,你可以在基类中提供一个虚拟的实现,而你所有的子类可以保持不变,并且可以在以后的时间点被采用来匹配新的接口。

此外,这种组合允许您定义契约(使用接口)并提供一些默认机制(使用抽象基类)。任何对默认值满意的人都可以从抽象基类继承。任何想要对任何小细节进行超精细控制的人都可以手动实现接口。

Ad 2:从技术角度来看,在final类中没有需要实现接口。但是,同样,这允许你把事物彼此分开来进化。CarService肯定是Service<Car>,但也许它甚至更多。也许只有CarService需要一些额外的东西,这些东西不应该进入公共接口或服务基类。

我想这就是为什么;-)