33

我看过以下代码布局阅读论坛和其他博客文章,并进行了修改以提出一些问题。

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 不应该足够吗?
4

1 回答 1

39

广告 1:额外的抽象基类允许您在不破坏实现的情况下发展接口。假设没有抽象基类,并且您要扩展接口,比如说添加一个新方法。然后你的实现被破坏了,因为你的类不再实现接口。

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

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

广告2:从技术角度来看,最终类中不需要实现接口。但是,这再次允许您将事物彼此分开发展。ACarService肯定是 a Service<Car>,但也许更多。也许只CarService需要一些不应该进入公共接口或服务基类的额外内容。

我想这就是为什么;-)

于 2012-12-30T15:24:34.583 回答