Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实现接口的c#抽象类_C#_Interface_Abstract - Fatal编程技术网

实现接口的c#抽象类

实现接口的c#抽象类,c#,interface,abstract,C#,Interface,Abstract,我在阅读论坛和其他博客文章时看到了下面的代码布局,并对其进行了修改,以便提出一些问题 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

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

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);
}
公共接口iSeries设备
{
int-Add(T实体);
无效更新(T实体);
}
公共抽象类ServiceBase:IService
{
公共int Add(T实体){…}
公共无效更新(T实体){…}
}
公共接口ICarService:IService
{
}
公共类somebase类:ServiceBase,ICarService
{
公共int Add(Car实体);
公共作废更新(Car实体);
}
我不明白的是让抽象类实现接口的好处。对我来说,这只是感觉有点重复,我无法理解让抽象类实现接口的好处

  • 为什么抽象类
    ServiceBase
    不按原样定义而不需要继承IService接口?这是双重密码吗
  • 为什么
    SomeBaseClass
    也必须实现
    ICarService
    ?服务基础不应该足够吗

  • Ad 1:附加的抽象基类允许您在不破坏实现的情况下改进接口。假设没有抽象基类,您可以扩展接口,比如添加一个新方法。然后您的实现被破坏,因为您的类不再实现接口

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

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

    Ad 2:从技术角度来看,没有必要在最终类中实现接口。但是,这又一次允许你独立地发展事物。
    CarService
    肯定是一种
    服务,但可能更重要。也许只有
    CarService
    需要一些不应该进入公共接口或服务基类的附加内容


    我想这就是原因;-)

    我注意到的一件事是,在SomeBaseClass中,我总是在方法上得到一个警告,上面说“X隐藏继承的成员Y。如果要隐藏,请使用new关键字”。由于抽象类有'Add',服务接口有'Add',它似乎不知道该做什么。你在最后一句中所说的“it”是指谁?编译器警告绝对正确。。。