直接在C#中使用接口

时间:2012-12-10 18:11:20

标签: c#-4.0 interface

我最近在“Professional C#4和.NET 4”中读到:

  

您永远无法实例化界面。

但我经常看到这样的事情:

IQuadrilateral myQuad;

直接使用接口有什么限制(没有继承自接口的类)?我怎么能使用这些对象(如果它们甚至可以被称为对象)?

例如,不是使用从IQuadrilateral派生的Square类,而是在多大程度上可以创建像IQuadrilateral myQuad这样的界面?

由于接口没有实现方法,我认为我不能使用任何方法。我认为接口没有字段(只有属性),所以我不确定如何用它们存储数据。

3 个答案:

答案 0 :(得分:4)

答案很简单,你无法实例化一个界面。

您提供的示例不是实例化接口的示例,您只是定义了IQuadrilateral

类型的局部变量

要实例化界面,您必须这样做:

IQuadrilateral myQuad = new IQuadrilateral();

这是不可能的,因为IQuadrilateral没有构造函数。

这完全有效:

IQuadrilateral myQuad = new Square();

但是你没有发起IQuadrilateral,你正在发起Square并将其分配给类型为IQuadrilateral的变量。

myQuad中可用的方法将是接口中定义的方法,但实现将基于Square中的实现。除非您将Square转换为IQuadrilateral变量,否则myQuad中不属于Square界面的任何其他方法都不可用。

答案 1 :(得分:2)

您无法创建界面实例。

您展示的代码定义了IQuadrilateral类型的变量。此变量指向的实际实例将始终是实现此接口的具体类。

答案 2 :(得分:0)

背景知识

将接口视为合同。在两个人之间的合同中,它定义了什么是有能力的,有关各方的期望是什么。在编程中,它的工作方式相同。界面定义了期望的内容,必须存在以符合该界面。因此,由于它只定义了预期的内容,它本身并没有提供实现,所以可以说是“幕后代码”。

属性的行为类似于字段,但允许您在有人为其分配值或读取值时进行拦截。您也可以拒绝阅读或写入它,您在定义属性时的选择。由于这个原因,接口使用属性而不是字段。由于“契约”只是定义应该存在哪些属性(名称和类型),并且如果它应该允许读取或写入功能,它将由实现者提供给它。

以.NET框架中的IEnumerator接口为例。此接口旨在允许迭代对象集合。目的不是更改项目,也不是随机访问它们,它只是为了获取对象A并移动到下一个,下一个,以及下一个,根据需要多次。许多集合类型实现了这一点:Queue,ArrayList,SortedList,Stack等。所有这些类型的对象都存储了许多对象,现在它们都共享共同的“契约”:能够逐个迭代它们。

但是,您可以看到IEnumerator接口声明了MoveNext()方法。为什么?这是因为可能无法以相同方式提供项目。例如,人们通常会从第一个项目到最后一个项目访问ArrayList。但是Stack被设计成相反的,人们可以将最后一个对象访问到第一个对象。

已回答的问题

有了这些知识,将变量声明为接口类型而不是实现接口的类类型的限制是,您只能访问接口(合同)所说的内容。但好处是您可以为此变量分配任何实现接口的类类型。