这个关于接口的理解正确吗?

10 浏览
0 Comments

这个关于接口的理解正确吗?

我看到了很多不同类型的答案,关于接口是什么(技术上的,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(尽管在理论上你可以这样做)。

你将只使用适当的接口与你的机器交互。

所以,你编写的任何类,都要编写适当的接口,以便使用者以标准方式与你的类进行交互。

请告诉我我的理解是否正确,或者需要修改?

0
0 Comments

接口是一种约定。通过在类中实现接口,你表示该类将提供某些方法。

例如,如果你创建一个类并使用IDisposable接口,那么你表示你的类将提供IDisposable指定的方法,比如Dispose()。

我认为你的理解基本正确,尽管我认为你对术语的使用有些不准确。例如,你说“所有的消费者类B、C、D...只会通过这两个接口与你的类进行通信,在应用程序中不会直接使用类A的实例”,类A仍然需要作为一个实例存在,只是该实例包括接口,并且他们只会使用那些方法。除非你使用静态方法,可以直接从类中调用这些方法。

这就是为什么我说"他们不会[直接]使用"。间接地,他们正在使用,并且他们必须使用。

0
0 Comments

接口的理解是否正确?

这个问题的出现是因为对接口的理解有一些偏差,接口并不是为每个类创建一个接口,而是为了确保类提供了特定的功能。接口允许使用类的人专注于功能而不是实现方式。

例如,列表需要具有添加、搜索和删除项目以及获取特定位置上的项目的方法。这可以转化为一个接口。现在可以有多个接口的实现,它们在内部的工作方式不同。例如,可以有一个以数组形式管理列表的ArrayList,一个实现链表的SingleLinkedList,或者一个实现双向链表的DoubleLinkedList。所有这些实现都是不同的,例如它们的性能也不同。

如果要编写一个对列表进行排序的方法,您不需要关心给定的列表是哪种类型 - 您只需要知道该实现实现了接口中声明的方法。

但是,并不是每个类都需要创建一个接口!有时候适当的类层次结构或抽象基类就足够了。

编辑:

我认为你的理解并不完全正确。你说的目标应该是尽可能少地使用类的功能。虽然接口可以用来实现你描述的目标,但在大多数情况下,并不是期望的情况,也不是接口的主要目标。

我的回答是:不完全正确。请看我的编辑。

"为每个类创建一个接口" - 如果你的所有类足够通用,可以被许多组使用,那么是的。看看Microsoft的System.dll,你会发现几乎每个类都有一些接口。

不,这不是真的。虽然有些类明确需要接口,但大多数类都不需要。请告诉我你是如何得出这个结论的。

几乎所有的列表类型都是IEnumerable,所有的基本数据类型(字符串、整数等)都有IComparable等。

0
0 Comments

从上述内容中,我们可以看出这个问题的出现原因是关于接口的理解。根据作者的观点,接口可以看作功能的标记,一个类可以有多个功能。当一个类继承接口时,就表示它能够执行这些功能。但是,并不是所有的消费者都需要所有的功能,或者需要与其他消费者相同的功能。

另一方面,接口不仅仅用于这个目的。有时候我们会使用接口来实现多重继承,有时候用于IOC(控制反转)的目的。但是在这个上下文中,作者认为你的理解是正确的。

针对这个问题,解决方法就是理解接口的作用和用途。接口可以用于标记类的功能,并且可以让类具备这些功能。但是并不是所有的消费者都需要所有的功能,所以在设计接口时需要考虑到这一点。另外,接口还可以用于实现多重继承和控制反转等其他用途。所以,理解接口的多重用途对于正确使用接口是很重要的。

0