[英]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.