关于.net:界面&

Interface & Base Abstract Class c#

定义一个接口,在一个基本抽象类中实现接口,给它默认的行为,然后从基类继承,这是一个好的实践吗?

或者是过度杀人?


使用接口或抽象类是两个完全不同的问题。可能两者的答案都是肯定的,但一方与另一方毫无关系。

除非你绝对确定你需要从一个基类继承并共享某些方法的多个类,否则我不会预先计划使用继承。当我们开始设想一个完美的教科书课程层次结构时,它往往会变得复杂而不可行。当您重构或者发现自己编写了一个类似的类并且不想复制代码时,这通常更有意义。

编写一个接口,然后实现它是一个很好的实践,例如,当您正在创建另一个类将依赖的东西时(这是非常常见的),如果您知道您的类将依赖于另一个"做某事"的类,那么您可以暂时停止在第一个类上的工作,以编写IDoesSomethinginter面对面,完成依赖于IDoesSomething的头等舱。您还没有弄清楚实现是什么,但这并不重要,因为您正在编写的类只取决于接口。(控制反转-良好实践)然后您可以编写实现IDoesSomething的类。

只是举例说明一下。假设我正在编写一个类,它提供一个Menu对象,其中包含一个嵌套的MenuItem对象列表:

1
2
3
4
5
6
7
8
public class MenuProvider
{
    public Menu GetMenu(string menuId)
    {
        //code that gets the menu
        return menu;
    }
}

然后我意识到在退回某些菜单项之前,我需要过滤掉它们。这可能基于配置设置、特定用户或任何其他设置。

我可以写这个接口:

1
2
3
4
public interface IMenuFilter
{
    void FilterMenu(Menu menu);
}

然后像这样修改我的原始类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MenuProvider
{
    private readonly IMenuFilter _menuFilter;

    public MenuProvider(IMenuFilter menuFilter)
    {
        _menuFilter = menuFilter;
    }

    public Menu GetMenu(string menuId)
    {
        //code that gets the menu

        //filter the menu
        _menuFilter.FilterMenu(menu);
        return menu;
    }
}

我不知道IMenuFilter的实现将是什么。实际上,它可能最终是一组单独的类的组合,每个类执行一种过滤。但问题是,我不需要停止我在MenuProvider上所做的工作来解决这个问题。我可以编写这个类,甚至用一个模拟的IMenuFilter测试它,然后继续编写这个过滤器的细节。


您是否有希望在此接口实现之间共享的公共功能?如果是,那么创建一个抽象基类。否则,现在别担心。您可以稍后添加一个。但编程到接口几乎总是一个好主意。


通常,您将使用接口或继承。我通常不会在同一个班上同时使用这两种语言。

要从基类继承功能时,请使用继承。

当您希望不同的类实现一些相同的核心功能,但不一定共享代码时,可以使用接口。