接口实例化与类实例化

时间:2011-08-26 23:44:40

标签: c# interface

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

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

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

三江源。

4 个答案:

答案 0 :(得分:48)

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

因此,在两个语句中,您的实例实际上是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可以调用这两种方法。

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

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:0)

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

查看C# Programming Guide to Interfaces以获取有关接口及其使用方式的更多信息。

答案 3 :(得分:0)

无法进行接口实例化。但是当我们使用它实现的类为接口创建一个对象时,它可以工作。

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

假设存在多重继承,为实现这一目标,我们需要首先使用。

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

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