11

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

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

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

Interface_object = class_object;    

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

4

7 回答 7

15

实际上,您不能创建接口的实例。

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

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中看到深入的解释

于 2013-06-25T06:18:46.713 回答
3

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

我喜欢使用的一个类比是接口就像一个掩码 - 当您创建一个实现接口的类的实例(例如IFoo),然后将该类视为接口,那么接口就像一个演员会的掩码wear - 即使在掩码(接口)下有一大堆东西,该类似乎也是接口(掩码)。

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

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

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

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

如果您想知道 MSIL 级别的幕后发生了什么,那么这里还有其他更有资格的人可以详细说明这一点。

于 2013-06-25T06:23:42.540 回答
1

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

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

于 2013-06-25T06:30:21.293 回答
0

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

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

于 2013-06-25T06:19:54.860 回答
0

您不创建接口实例,而是将派生对象实例引用分配给它,因此它包含在该接口类型中。这是一个多态性

于 2013-06-25T06:20:00.703 回答
0

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

于 2013-06-25T06:23:22.057 回答
0

不能创建接口的对象,但可以创建类的对象,让类使用接口。

于 2013-06-25T06:19:37.510 回答