c#接口和继承的最佳实践

c#接口和继承的最佳实践,c#,inheritance,interface,abstract-class,C#,Inheritance,Interface,Abstract Class,我有一个带有接口的抽象基类 interface ISubmit { bool SubmitFile(); } public abstract class SubmitMaster : ISubmit { public abstract bool SubmitFile(); } public class SubmitRoute : SubmitMaster { public override bool SubmitFile() { //... }

我有一个带有接口的抽象基类

interface ISubmit {
    bool SubmitFile();
}

public abstract class SubmitMaster : ISubmit {
    public abstract bool SubmitFile();
}

public class SubmitRoute : SubmitMaster {
    public override bool SubmitFile() {
        //...
    }
}
基类有一些其他子类使用的实现方法,但我需要确保每个子类都有SubmitFile()方法,并且每个子类都需要自己的块。目前,它的工作还不错,但我觉得我所做的是相当多余的。我需要界面吗?还是让基类和SubmitFile()抽象是错误的做法


在这种情况下,最佳做法是什么?

在您的情况下,接口是绝对冗余的

如果其他类不一定从
SubmitMaster
abstract class派生,那么我可能仍然会维护这样一个接口

或者,如果接口是API的一部分,并且不需要在需要使用
SubmitFile
方法的地方公开
SubmitMaster
抽象类的所有成员

事实上,我可以在这里给出很多接口有用的理由,但是如果您只是定义一个接口来在抽象类中实现它,并且您从不将引用键入所谓的接口,那么,同样,它是绝对冗余的

进一步阅读:

在这种情况下,最佳做法是什么?我需要界面吗

你是否打算制作,比如说至少三种类型,它们彼此没有任何关系,但都可以用作ISubmit

例如,假设我们有一个表示序列的接口。我可以给你一打完全不相关的类,它们都是序列。数组、列表、字典、树等等,它们都是序列。所以我们制作了一个表示序列的接口,IEnumerable


如果您不打算制作一堆有共同用例的不相关的东西,那么不要使用界面。

可能是一本不错的读物。它没有明确回答您的问题,但它可能有助于您做出决定。我知道您不喜欢它,但是依赖注入可能是定义接口的一个原因,即使您没有“一堆不相关的东西”@LucaCremonesi:如果你不打算使用不同的依赖项实现来注入,那么你在依赖项注入上瞎混什么呢?这似乎是一笔不必要的费用。@LucaCremonesi,为什么DI需要一个接口?你说的是一个特定的框架吗?当只有一种可能的实现时,我总是在不使用接口的情况下将服务注入类中。(虚拟成员解决了潜在的模拟需求)。我知道我可以使用服务工厂,有时我也可以,但在很多情况下,这并不值得努力。@adrianm:我特别在单元测试中使用DI,这样测试包含依赖项的类就更容易了。在这种情况下,使用接口而不是具体的类可以使模拟更加有效和灵活,可以使用诸如NSubstitute之类的框架。“你为什么要玩弄依赖项注入?”——正如我在上一篇评论中所写的,我在NSubstitute框架的帮助下使用依赖项注入进行单元测试。在这种情况下,有效地模拟接口比模拟具体类更容易。
interface ISubmit {
    bool SubmitFile();
}

public abstract class SubmitMaster : ISubmit {
    public abstract bool SubmitFile();
}

public class SubmitRoute : SubmitMaster {
    public override bool SubmitFile() {
        //...
    }
}