当我们创建一个接口对象时会发生什么?

时间:2013-06-25 06:14:56

标签: c# oop interface

我是C#界面的新手。那么有人可以解释当我们创建一个接口对象时实际发生了什么吗?

我知道为什么我们在其他语言中有接口但却无法真正掌握为什么C#允许创建接口的对象(实例)的逻辑? 如果接口没有函数定义或变量,那么如何创建对象?

我一直在论坛上搜索,但无法明白这一点。 这是我在界面上找到的教程 http://www.c-sharpcorner.com/uploadfile/6897bc/interfaces-in-C-Sharp/ 如果您访问该链接,您可以看到作者首先创建一个类的对象而不是一个inteface对象。当他写作

Interface_object = class_object;    

接口对象从类对象中提取特征..​​.
如果界面中没有实现和变量,它会如何以及为什么会发生?

7 个答案:

答案 0 :(得分:11)

实际上您无法创建接口的实例。

您创建了某个类的实例,实现了该接口。实际上可以有几十个类,实现一个接口。因此,当您使用接口类型的变量时,唯一可以保证的是,实际由变量引用的对象实现了接口,您可以使用任何接口方法,属性等。

interface IFoo
{
   void DoFoo();
}

class Foo1: IFoo
{
    public DoFoo()
    {
        //one implementation
    }
}

class Foo2: IFoo
{
    public DoFoo()
    {
        //the other implementation
    }
}

IFoo tmp = new Foo1();
tmp = new Foo2();

您可以在SO: Using Interface variables

中看到深入的解释

答案 1 :(得分:2)

  

有人可以解释当我们创建一个接口对象时实际发生了什么吗?

我喜欢使用的类比是接口就像一个掩码 - 当你创建一个实现接口的类的实例(例如 IFoo )时,然后将该类视为接口然后界面就像一个演员会穿的面具 - 即使面具(界面)下面有很多东西,这个类看起来像是界面(蒙版)。

  

但是不能真正掌握为什么C#允许创建接口的对象(实例)的逻辑?

另一件要提到的是接口是一个契约 - 无论在接口上定义了什么方法/属性/等,都保证在类上实现。彼此完全完全不同的类可以实现相同的接口 - 当您拥有每个类的实例并将其作为接口处理(转换)时,可以在每个类上调用相同的方法,尽管实现(实际代码)在每个类中都可以大不相同。

示例:
CarHuman都实现了接口IMove,而IMove定义了方法void Move();。它们都是完全不相关的类,没有共同的祖先,但是如果你有Car和Human的实例,那么它们都保证有方法void Move(),尽管那个方法中的代码会因为它们而有所不同。以完全不同的方式行动。如果然后将这些不同的对象转换为同一个接口(var x = (IMove) someCarvar x = someHuman as IMove),那么您可以相同地处理对象引用。

接口和抽象类有一些相似之处 - 它们都以契约方式指定事物(扩展器或实现者必须实现特定的东西),并且它们都不能直接创建(区别在于抽象类可以提供一些实现,而接口不能,接口只能实现,永远不能继承。)

如果您想知道在MSIL级别下会发生什么,那么周围还有其他更有资格的人可以详细说明。

答案 2 :(得分:1)

接口就是一个接口。您无法实例化接口。您可以将它用作指向实现该接口的类的变量。 Interface是方法/属性的公共集合,保证其所有方法都已实现。抽象类与接口类似,但它不提供这样的保证。

在OOP中,这是一种多态性,还有其他类型的多态性。

答案 3 :(得分:0)

您无法创建接口的对象,但您可以创建类的对象并让该类使用该接口。

答案 4 :(得分:0)

您无法实例化接口。 但是,如果类正在实现接口,则可以创建接口的新引用。

这只是创建对象MyNokiaOldPhone INokiaOld iface = phone;的新引用,它实现了接口INokiaOld

答案 5 :(得分:0)

您不是创建接口的实例,而是将派生的对象实例引用分配给它,因此它将包装到该接口类型中。这是 polymorphysm

答案 6 :(得分:0)

据我所知你不能创建一个接口的实例,即使我们这样做也没有用,因为该类中没有任何成员被实现。抽象类的情况也是如此。这是因为它们不完整(即它们充当模板),并且对于不完整的类,对象的创建没有意义。