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

12

我对C#中的接口还不熟悉,所以请问当我们创建一个接口对象时到底会发生什么?

我知道为什么其他语言会有接口,但是无法理解为什么C#允许创建接口对象(实例)。 如果接口没有函数定义或变量,那么怎么能创建对象呢?

我在论坛上搜索过,但是找不到关键点。我在这里找到了一篇介绍接口的教程: http://www.c-sharpcorner.com/uploadfile/6897bc/interfaces-in-C-Sharp/ 如果您访问该链接,您会看到作者首先创建了一个类的对象,然后创建了一个接口的对象。当他写:

Interface_object = class_object;    

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


4
因为裸接口没有代码,所以无法创建裸接口。但在某些编程语言中,你可以提供接口所有方法的即时实现来实例化一个匿名接口实现类。我知道 Java 可以这样做。 - Patashu
我知道为什么其他语言中有接口,但真的无法理解在C#中的逻辑。你能解释一下吗?C#中的接口有何不同?Java或C++在这方面不是基本相同吗?你认为我们为什么需要接口? - Kobi
一个接口基本上为多个对象定义了一个共同的结构,需要针对每个对象进行不同的实现。 - Avram Tudor
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中找到深入的解释。


3
有人能解释一下当我们创建一个接口对象时实际发生了什么吗?
我喜欢使用比喻,将接口比作面具。当你创建一个实现接口(例如IFoo)的类的实例时,将该类视为接口,则接口就像演员戴的面具,即使在面具下有很多东西(接口),该类看起来和行为都像接口。
但是真正理解为什么C#允许创建接口对象(实例)还是有些困难?
另一件要提到的事情是,接口是一个契约 - 接口上定义的任何方法/属性/等都保证在类上实现。 完全不同于彼此的类可以实现相同的接口 - 当您拥有每个类的实例并将其(强制转换)为接口时,那么每个类上都可以调用相同的方法,尽管每个类中的实现(实际代码)可能大不相同。
例如:Car和Human类都实现IMove接口,并且IMove定义了方法void Move()。他们是没有共同祖先的完全不相关的类,但是如果您有Car和Human的实例,则它们都保证具有方法void Move(),尽管该方法中的代码将因它们以完全不同的方式移动而有所不同。如果然后将这些不同的对象强制转换为相同的接口(var x =(IMove)someCar或var x = someHuman as IMove),则可以将对象引用视为相同。
接口和抽象类有一些相似之处-它们都以契约方式指定事物(扩展者或实现者必须实现特定内容),并且它们都不能直接创建(区别在于抽象类可以提供某些实现,而接口不能,接口只能被实现,永远不能被继承)。
如果你想知道在MSIL级别下面发生了什么,那么这里还有其他更有资格的人可以详细解释。

1

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

在面向对象编程中,这是一种多态性,还有其他类型的多态性。


0

你不能创建一个接口的对象,但是你可以创建一个类的对象并让这个类使用该接口。


0

你不能实例化接口。 但是,如果类实现了接口,你可以创建一个新的接口引用。

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


0

你不会创建一个接口的实例,但是可以将派生对象实例引用分配给它,这样它就被包装成该接口类型。这就是多态。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接