接口实例化与类实例化
有人可以帮助了解以下代码是否相同。 如果不是类和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,为实现这一点,我们需要先进行。
我们没有必要提供第二种方式。
接口限制数据及其类成员的直接访问。