接口实例化与类实例化

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

IUnityContainer container = new UnityContainer() UnityContainer container = new UnityContainer() 

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

谢谢。

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

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

不同之处在于第一个语句,就C#而言,您的container是实现IUnityContainer东西,它可能具有与UnityContainer不同的API。


考虑:

 interface IAnimal { void die(); } class Cat : IAnimal { void die() { ... } void meow() { ... } } 

现在:

 IAnimal anAnimal = new Cat(); Cat aCat= new Cat(); 

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

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

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

实际上没有“接口实例化”这样的东西,但是有接口变量。 第一行是一个这样的变量的例子。

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

在代码中使用接口变量时,它允许您更轻松地切换具体实现,这使您的代码更加灵活。

实例化并存储在IUnityContainer container变量中的对象被编译器认为只有IUnityContainer接口中定义的成员。 也就是说,如果UnityContainer类包含未由IUnityContainer接口定义的成员,则您将无法调用它们。 另一方面,您可以在IUnityContainer container变量中“放置”实现IUnityContainer接口的任何对象 – 而不仅仅是UnityContainer实例。 使用第二个声明,您会在其inheritance层次结构中UnityContainer和对象的实例。

查看接口的C#编程指南,了解有关接口及其使用方式的更多信息。

接口实例化是不可能的。 但是当我们使用其实现的类创建一个接口对象时,它可以工作。

 IUnityContainer container = new UnityContainer()// It is assigning an object of its implemented class. UnityContainer container = new UnityContainer() // To access directly by using like this. 

假设存在多重inheritance,为实现这一点,我们需要先进行。

我们没有必要提供第二种方式。

接口限制数据及其类成员的直接访问。