接口实例化与类实例化

Nil*_*Pun 22 c# interface

有人可以帮助了解以下代码是否相同.如果不是类和interfance实例之间的区别.

IUnityContainer container = new UnityContainer()
UnityContainer container = new UnityContainer()
Run Code Online (Sandbox Code Playgroud)

据我所知,Inteface只有方法签名,如果接口已由3个类实现.不太确定上面的第一个语句会创建哪个3实例.

谢谢.

Nul*_*ion 51

根据定义,无法实例化接口.你总是实例化一个具体的类.

因此,在两个语句中,您的实例实际上都是类型UnityContainer.

不同之处在于第一个语句,就C#而言,您的container实现方式IUnityContainer可能与API不同UnityContainer.


考虑:

interface IAnimal 
{
    void die();
}

class Cat : IAnimal 
{
    void die() { ... }
    void meow() { ... }
}
Run Code Online (Sandbox Code Playgroud)

现在:

IAnimal anAnimal = new Cat();
Cat aCat= new Cat();
Run Code Online (Sandbox Code Playgroud)

C#肯定知道anAnimal.die()有效,因为die()在中定义了IAnimal.但它不会让你做,anAnimal.meow()即使它是一个Cat,而aCat可以调用这两种方法.

当您使用界面作为类型时,您在某种程度上会丢失信息.

但是,如果您有另一个Dog也实现的类IAnimal,您anAnimal也可以引用一个Dog实例.这就是界面的力量; 你可以给他们任何实现它的类.

  • 当你*可以*实例化一个接口时,有一个例外情况:它是一个COM接口. (7认同)

Fis*_*rdo 5

真的没有“接口实例化”这样的东西,但是有接口变量。第一行是一个此类变量的示例。

在第一行中,您可以实例化为container任何实现IUnityContainer. 对于第二行,container对象只能从UnityContainer类或派生类实例化。

当您在代码中使用接口变量时,它可以让您更轻松地切换出具体的实现,从而使您的代码更加灵活。