繁体   English   中英

接口和基本抽象类c#

[英]Interface & Base Abstract Class c#

定义接口,在基本抽象类中实现接口,赋予其默认行为然后从基类继承是一种好习惯吗?

还是那太过分了?

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

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

当创建另一个类将要依赖的东西时(通常是这样),编写一个接口然后实现它是一个好习惯。例如,如果您知道自己的类将依赖于另一个类,则“ ”,那么您可以暂时停止在第一类上的工作,以编写IDoesSomething接口,并完成依赖于IDoesSomething的第一类。 您尚未弄清楚实现的内容,但这无关紧要,因为您正在编写的类仅取决于接口。 (反转控制-好的做法。)然后,您可以编写一个实现IDoesSomething的类。

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

public class MenuProvider
{
    public Menu GetMenu(string menuId)
    {
        //code that gets the menu
        return menu;
    }
}

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

我可能会写这个接口:

public interface IMenuFilter
{
    void FilterMenu(Menu menu);
}

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

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对其进行测试,然后继续编写该过滤器的详细信息。

您是否希望在该接口的实现之间共享常用功能? 如果是这样,则创建一个抽象基类。 否则,现在不必担心。 您以后可以随时添加一个。 但是对接口编程几乎总是一个好主意。

一般情况下,你会用一个接口 继承。 我通常不会在同一个类中都不使用这两者。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM