C# 试图完全理解C中的接口#

C# 试图完全理解C中的接口#,c#,oop,interface,C#,Oop,Interface,大家好,我一直在对C#中的接口进行大量研究,我读了很多书,看了很多视频,但是呃,我的灯泡还没有打开:-( ​Q1假设我们在实现的类中有一个方法,它的名称是Show(),在该方法中我们有一个数组,它用Show()方法实现接口ISample 现在,如果实现中该方法的内部结构从数组更改为列表 因为我们使用的是一个接口,这是否意味着如果它在数千个地方被调用,它不会中断,因为它仍然在调用方法名,并且不关心一旦方法名和接口方法名之间保持契约,内部会做什么,从而遵守契约承诺 希望我能更好地澄清这一点,以便有人

大家好,我一直在对C#中的接口进行大量研究,我读了很多书,看了很多视频,但是呃,我的灯泡还没有打开:-(

​Q1假设我们在实现的类中有一个方法,它的名称是Show(),在该方法中我们有一个数组,它用Show()方法实现接口ISample

现在,如果实现中该方法的内部结构从数组更改为列表

因为我们使用的是一个接口,这是否意味着如果它在数千个地方被调用,它不会中断,因为它仍然在调用方法名,并且不关心一旦方法名和接口方法名之间保持契约,内部会做什么,从而遵守契约承诺


希望我能更好地澄清这一点,以便有人能为我澄清这一点。提前感谢您的回复:)

您用自己的一个例子一针见血

如果在实现中将该方法的内部结构从数组更改为列表


假设您正在编写一个报告类,并且希望统计返回类型列表、列表、集合、堆栈和队列的各种源中的项目数。您可以为每个返回的类型编写一个方法,并继续为遇到的每个新类型编写新计数器。或者您可以编写一个接受任何IEnumerable的单计数器方法。

接口可以提高可维护性(如果操作正确)。接口也可用于提供多重继承的效果,但它们是不同的概念

理解接口的关键是理解耦合的概念。耦合本质上意味着代码的交织程度。耦合越强,当您进行更改时,中断的内容就越多。当您想到紧密耦合时,请想到一个由缠结的绳线组成的紧密球。我们想要的是一个松散的线团,尽可能减少缠结。纠结是不好的,因为每次我们改变某些东西时,每一次对这种改变的纠结都会导致我们的代码被破坏。接口是实现松耦合的一种方法


下面是一个很好的线程,它进一步解释了耦合:

接口与内部或实现无关。它们与被称为某种方式的能力有关

接口是一个类承诺支持具有特定签名的调用。例如,如果您有一个可以显示的控件列表,那么您可能会有一个类似

interface IShowable
{
     void Show();
}
如果列表中有十几个不同类型(和类)的控件,只要它们支持接口,仍然可以使用类型无关代码显示它们。例如:

var list = new List<IShowable>();
list.Add(new MyShowableTextBoxControl());    
list.Add(new MyShowableClockControl());    
list.Add(new MyShowableSmileyControl());
foreach (var item in list) list.Show();  //Magic!!

…然后,在代码的主要部分,您可以安全地调用通用数据库库中的任何内容,而无需担心调用的是Oracle还是SQL Server

IGenericDatabaseLibrary db = Factory.GetDatabaseLibrary(); //We don't know what this is going to return
db.ExecuteQuery(sql); //As long as ExecuteQuery is in the interface, we know we can call it

不确定这个问题是否适合这样做。有很多资源可以告诉您什么是C#接口,您应该自己使用它。你有什么特别的问题吗?你可能会在“是”上找到更多的帮助,我在来这里之前已经试着理解了这些,我不仅仅是在做研究,我一直在努力理解这一点,我想我会问堆栈溢出问题,也许有人能帮我:-)@Projectrevolution,接口不是为了补偿C#的单一继承限制。如果我有一个实现了
IComparable
的类,这并不意味着我继承了
IComparable
 class SqlServerLibrary : IGenericDatabaseLibrary
IGenericDatabaseLibrary db = Factory.GetDatabaseLibrary(); //We don't know what this is going to return
db.ExecuteQuery(sql); //As long as ExecuteQuery is in the interface, we know we can call it