这个关于接口的理解正确吗?
这个关于接口的理解正确吗?
我看到了很多不同类型的答案,关于接口是什么(技术上的,C#)以及为什么会有接口等等。今天我想问你们一个问题,我的理解是否正确?当你希望你的消费者类(比如类B、C、D、E)使用类A时,你会在类A上实现一个接口(并且这个接口的名称就是原因)。
比如说,类A具有删除员工工作历史数据和删除员工技能数据的功能。这个类A有一个非空属性叫做Employee_Id。
现在你会实现2个接口IDeleteWorkHistroy和IDeleteSkillSet,并在类A中实现它们。
所有的消费者类B、C、D...将只通过这两个接口与你的类进行交互,在应用程序的任何地方都不会直接使用类A的实例。
例如,在类B中只想删除员工工作历史记录:
IDeleteWorkhistory EmpWH = new 类A(emp_id);
在类B的其他地方,你只会使用EmpWH,不会使用类A的其他任何东西。
基本上,你的类的使用者只会使用他需要的那些东西,或者以另一种方式说,使用者将通过他所需要的接口与你的类进行交互。
换句话说(键盘是你计算机的接口),如果你想与计算机交互,你不需要一个比特序列器,通过中断将比特信息逐位传递给CPU(尽管在理论上你可以这样做)。
你将只使用适当的接口与你的机器交互。
所以,你编写的任何类,都要编写适当的接口,以便使用者以标准方式与你的类进行交互。
请告诉我我的理解是否正确,或者需要修改?
接口的理解是否正确?
这个问题的出现是因为对接口的理解有一些偏差,接口并不是为每个类创建一个接口,而是为了确保类提供了特定的功能。接口允许使用类的人专注于功能而不是实现方式。
例如,列表需要具有添加、搜索和删除项目以及获取特定位置上的项目的方法。这可以转化为一个接口。现在可以有多个接口的实现,它们在内部的工作方式不同。例如,可以有一个以数组形式管理列表的ArrayList,一个实现链表的SingleLinkedList,或者一个实现双向链表的DoubleLinkedList。所有这些实现都是不同的,例如它们的性能也不同。
如果要编写一个对列表进行排序的方法,您不需要关心给定的列表是哪种类型 - 您只需要知道该实现实现了接口中声明的方法。
但是,并不是每个类都需要创建一个接口!有时候适当的类层次结构或抽象基类就足够了。
编辑:
我认为你的理解并不完全正确。你说的目标应该是尽可能少地使用类的功能。虽然接口可以用来实现你描述的目标,但在大多数情况下,并不是期望的情况,也不是接口的主要目标。
我的回答是:不完全正确。请看我的编辑。
"为每个类创建一个接口" - 如果你的所有类足够通用,可以被许多组使用,那么是的。看看Microsoft的System.dll,你会发现几乎每个类都有一些接口。
不,这不是真的。虽然有些类明确需要接口,但大多数类都不需要。请告诉我你是如何得出这个结论的。
几乎所有的列表类型都是IEnumerable,所有的基本数据类型(字符串、整数等)都有IComparable等。
从上述内容中,我们可以看出这个问题的出现原因是关于接口的理解。根据作者的观点,接口可以看作功能的标记,一个类可以有多个功能。当一个类继承接口时,就表示它能够执行这些功能。但是,并不是所有的消费者都需要所有的功能,或者需要与其他消费者相同的功能。
另一方面,接口不仅仅用于这个目的。有时候我们会使用接口来实现多重继承,有时候用于IOC(控制反转)的目的。但是在这个上下文中,作者认为你的理解是正确的。
针对这个问题,解决方法就是理解接口的作用和用途。接口可以用于标记类的功能,并且可以让类具备这些功能。但是并不是所有的消费者都需要所有的功能,所以在设计接口时需要考虑到这一点。另外,接口还可以用于实现多重继承和控制反转等其他用途。所以,理解接口的多重用途对于正确使用接口是很重要的。