c#抽象类实现一个接口

Posted

技术标签:

【中文标题】c#抽象类实现一个接口【英文标题】:c# Abstract Class implementing an Interface 【发布时间】:2012-12-15 00:52:57 【问题描述】:

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

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&lt;T&gt;不直接定义,不需要继承IService接口?这是加倍代码吗? 为什么SomeBaseClass 也必须实现ICarService? ServiceBase 不应该足够吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

我想这就是为什么;-)

【讨论】:

我注意到的一件事是在 SomeBaseClass 中,我总是收到有关方法的警告,上面写着“X 隐藏继承的成员 Y。如果打算隐藏,请使用 new 关键字”。由于抽象类有'Add',服务接口有'Add',它似乎不知道该怎么做。 最后一句中的“它”是指谁?编译器警告就在那里...

以上是关于c#抽象类实现一个接口的主要内容,如果未能解决你的问题,请参考以下文章

C#中接口和抽象类

C#程序设计之抽象类多态和接口

抽象类的 C# 接口继承

C#:抽象类需要实现接口吗?

C# 中基类,虚类,抽象类,密封类,接口的区别

c#中抽象类(abstract)和接口(interface)的相同点与区别