【问题标题】:c# best practices for interface and inheritancec#接口和继承的最佳实践
【发布时间】:2016-07-05 19:52:01
【问题描述】:

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

interface ISubmit {
    bool SubmitFile();
}

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

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

基类还有一些其他子类使用的实现方法,但我需要确保每个子类都有 SubmitFile() 方法,并且每个子类都需要自己的块。目前,它工作得很好,但我觉得我所做的相当多余。我什至需要接口吗?还是让基类和 SubmitFile() 抽象是错误的举动?

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

【问题讨论】:

标签: c# inheritance interface abstract-class


【解决方案1】:

在您的情况下,该接口绝对是多余的。

也许我仍然会维护这样的接口如果它应该由其他类实现,而不必从SubmitMaster抽象类派生

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

事实上,我可以在这里提出很多接口有用的理由,但如果你只是定义一个接口来在抽象类中实现它,而你从不将引用键入为所谓的接口,那么,再一次,这绝对是多余的。

进一步阅读:

【讨论】:

    【解决方案2】:

    在这种情况下,最佳做法是什么?我什至需要接口吗?

    您是否打算制作,至少三种类型,它们彼此之间没有任何关系,但所有类型都可以用作ISubmit?

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

    如果你不打算制作一堆不相关但有共同用例的东西,那么不要使用接口

    【讨论】:

    • 我知道你不喜欢它,但是即使你没有“一堆不相关的东西”,依赖注入也可能是定义接口的一个原因。
    • @LucaCremonesi:好吧,如果您不打算注入不同的依赖项实现,那么您在搞什么依赖注入呢?这似乎是一笔不必要的开支。
    • @LucaCremonesi,为什么 DI 需要接口?您是在谈论特定的框架吗?当只有一种可能的实现时,我一直将服务注入类而不使用接口。 (虚拟成员解决了潜在的模拟需求)。我知道我可以使用服务工厂,有时我会这样做,但在很多情况下这不值得。
    • @adrianm:我特别使用 DI 进行单元测试,这样更容易测试包含依赖项的类。在这种情况下,使用接口而不是具体的类可以使用 NSubstitute 等框架使模拟更加有效和灵活。
    • "你用依赖注入干什么?" - 正如我在上一条评论中所写,我在 NSubstitute 框架的帮助下使用依赖注入进行单元测试。在这种情况下,有效地模拟接口比模拟具体类更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    相关资源
    最近更新 更多