【问题标题】:What happens when we create an object of interface? [duplicate]当我们创建一个接口对象时会发生什么? [复制]
【发布时间】:2013-06-21 20:05:21
【问题描述】:

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

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

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

Interface_object = class_object;    

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

【问题讨论】:

  • 您无法创建裸接口,因为它没有代码,但在某些语言中,您可以通过提供所有接口方法的现场实现来实例化接口的匿名实现。我知道在 Java 中你可以做到这一点。
  • “我知道为什么我们有其他语言的接口,但不能真正掌握 [...] C# 的逻辑” - 你能解释一下吗? C# 中的接口有何不同?在这方面,Java 或 C++ 不是几乎相同吗?你为什么认为我们有接口?
  • 一个接口基本上定义了多个对象的通用结构,每个对象需要以不同的方式实现。

标签: c# oop interface


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    谁能解释一下当我们创建一个接口对象时实际发生了什么?

    我喜欢使用的一个类比是接口就像一个掩码——当你创建一个实现接口的类的实例时(例如IFoo),然后将该类视为接口然后界面就像演员会戴上的面具——这个类似乎是并充当界面(面具),即使面具下有一大堆东西(界面)。

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

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

    示例:
    CarHuman都实现了接口IMoveIMove定义了方法void Move();。它们都是完全不相关的类,没有共同的祖先,但如果你有 Car 和 Human 的实例,那么它们都保证有方法 void Move(),尽管当它们进入时,该方法中的代码会有所不同完全不同的方式。如果您随后将这些不同的对象强制转换为同一个接口(@98​​7654327@ 或var x = someHuman as IMove),那么您可以相同地对待对象引用。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                猜你喜欢
                • 2014-03-02
                • 2013-10-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-10-24
                • 1970-01-01
                • 2015-09-16
                相关资源
                最近更新 更多