【问题标题】:Trying to Fully Understand Interface in C#尝试完全理解 C# 中的接口
【发布时间】:2017-05-24 07:47:03
【问题描述】:

您好,我一直在对 C# 中的接口进行大量研究,并且我已经阅读了很多书籍并观看了视频,但是我的灯泡还没有打开 :-(

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

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

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

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

【问题讨论】:

  • 不确定这个问题是否适合 SO。有许多资源可以告诉您什么是 C# 接口,您应该自己动手玩。 msdn.microsoft.com/en-us/library/87d83y5b.aspxmsdn.microsoft.com/en-us/library/ms173156.aspx
  • 您有什么具体问题吗?
  • 您可能会在softwareengineering.stackexchange.com找到更多帮助
  • 是的,在来这里之前我已经尝试了解这些,我不只是发布新娘做我的研究,我一直在努力理解这一点,我想我会问的堆栈溢出,也许有人可以帮助我:-)
  • @Projectrevolution 此外,接口并不是为了弥补 C# 对单一继承的限制。如果我有一个实现IComparable<T> 的类,这并不意味着我继承了IComparable<T>

标签: c# oop interface


【解决方案1】:

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

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

的界面
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。如果你有两个班级

 class OracleLibrary : IGenericDatabaseLibrary

 class SqlServerLibrary : IGenericDatabaseLibrary

...然后在您的代码的主要部分,您可以安全地调用通用数据库库中的任何内容,而不必担心您是调用 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

【讨论】:

    【解决方案2】:

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

    理解接口的关键是理解耦合的概念。耦合本质上意味着你的代码是如何交织在一起的。耦合越多,当你做出改变时,就会有越多的东西被破坏。当您想到紧密耦合时,请想到一团缠结的麻线。我们想要的是一个松散的麻线球,尽可能少的缠结。纠缠是不好的,因为每次我们更改某些内容时,与该更改的每次纠缠都会导致我们的代码中断。接口是实现松耦合的一种方式。

    这里有一个很好的线程来进一步解释耦合:What is "loose coupling?" Please provide examples

    【讨论】:

      【解决方案3】:

      你用自己的例子一针见血

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-25
        • 2021-12-19
        • 2020-08-18
        • 2017-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多