我已经看过以下代码布局阅读论坛和其他博客文章并进行了调整以便提出几个问题。
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);
}
我不理解的是让抽象类实现接口的好处。对我来说,它只是感觉有点重复,我无法理解实现接口的抽象类的好处。
ServiceBase<T>
只是定义为不需要继承IService接口?这会使代码倍增吗?SomeBaseClass
也必须包含ICarService
? ServiceBase不应该足够吗?答案 0 :(得分:33)
Ad 1:附加的抽象基类允许您在不破坏实现的情况下发展接口。假设没有抽象基类,你可以通过添加一个新方法来扩展接口。然后你的实现被破坏了,因为你的类不再实现接口了。
使用额外的抽象基类,您可以将其分开:如果向接口添加新方法,则可以在基类中提供虚拟实现,并且所有子类可以保持不变,并且可以采用在以后的时间点匹配新界面。
此外,这种组合允许您定义一个契约(使用接口)并提供一些默认机制(使用抽象基类)。任何对默认值都没问题的人都可以从抽象基类继承。任何想要对任何小细节进行超级精细控制的人都可以手动实现界面。
广告2:从技术角度来看,在最终课程中没有 NEED 来实现界面。但是,这再次允许您将事物彼此分开。 CarService
肯定是Service<Car>
,但也许更多。也许只有CarService
需要一些不应该进入公共接口或服务基类的其他东西。
我猜这就是原因; - )