有人可以帮助了解以下代码是否相同。如果不是类和interfance实例之间的区别。
IUnityContainer container = new UnityContainer()
UnityContainer container = new UnityContainer()
据我所知,Inteface只有方法签名,如果接口已由3个类实现。不太确定上面第一个语句会创建哪个3实例。
三江源。
答案 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.
假设存在多重继承,为实现这一目标,我们需要首先使用。
我们没有必要提供第二种方式。
接口限制数据及其类成员的直接访问。