C# 抽象类实现接口

32

我在论坛和博客文章中看到了以下的代码布局,并进行了改编以便提出一些问题。

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不足以满足要求吗?
1个回答

39

广告1:使用额外的抽象基类可以使接口在不破坏实现的情况下进行演化。假设没有抽象基类,您扩展了接口,比如添加了一个新方法。那么你的实现就会出问题,因为您的类不再实现接口。

使用额外的抽象基类,您可以将其分离:如果您向接口添加新方法,则可以在基类中提供虚拟实现,所有子类都可以保持不变,并可以在稍后的时间调整以匹配新接口。

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

广告2:从技术角度来看,没有必要在最终类中实现接口。但是,这样可以使您可以将事物分开演进。CarService肯定是Service<Car>,但也许它还需要一些不应该进入公共接口或服务基类的其他东西,仅适用于CarService。

我想这就是为什么;-)


1
我注意到的一件事是,在SomeBaseClass中,我总是会收到有关方法的警告,该警告显示“X hides inherited member Y. Use the new keyword if hiding was intended”。由于抽象类具有“Add”,服务接口也具有“Add”,似乎不知道该怎么做。 - fes
1
在最后一句话中,你所说的“它”是指谁?编译器的警告是完全正确的... - Golo Roden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接