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上定义.然后投射到后者是没有意义的.
总结以上是内存溢出为你收集整理的c# – 使用接口创建对象全部内容,希望文章能够帮你解决c# – 使用接口创建对象所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)