c# – 使用接口创建对象
在C#中,我们可以继承多个接口.在这种情况下,如果创建了一个对象,它只是隐藏属性或方法,还是编译器会避免创建和内存分配给其他接口的那些?例如,我有两个接口和一个类如下
interface IExample1 { void E1Test1(); void E1Test2(); } interface IExample2 { void E2Test1(); void E2Test2(); } class Example : IExample1,IExample2 { public void E1Test1() { throw new NotImplementedException(); } public void E1Test2() { throw new NotImplementedException(); } public void E2Test1() { throw new NotImplementedException(); } public void E2Test2() { throw new NotImplementedException(); } } 当我创建像, IExample1 IE1 = new Example(); IExample2 IE2 = new Example(); 编译器是否会为包括所有方法在内的两个接口创建完整对象,并将其隐藏为无法访问的接口?或者只是使用可用于特定界面的方法创建? 解决方法
当你使用它的构造函数(在使用new …之后)实例化一个类时,总是在内存中有一个完整的clas实例.没有接口实例这样的东西.
另一方面的接口只是该实例的某种视图.因此,在您的示例中,您的实例上存在四种方法.但是,您可能会也可能不会从IExample1或IExample2类型的引用中访问这些方法.例如.你不能在IExample1类型的引用上使用E2Test1,尽管底层实例确实有这个方法: IExample1 i1 = new Example(); 现在调用i1.E1Test1()将编译得很好,而i1.E2Test1()则不会,因为该方法是在另一个接口上定义的.但是,您可以简单地将i1引用的实例强制转换为另一个接口,并以这种方式访问??该成员: IExample i2 = (IExample2) i1; i2.E2Test1(); 从TimSchmelters开始编辑评论:如果你的Example-class只实现了IExample1而没有实现另一个接口,那么肯定会失败并在运行时产生InvalidCastException.因此,在这种情况下,Example-class的实例只会在IExample1上定义成员,而不是在IExample2上定义.然后投射到后者是没有意义的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |