c# – 使用接口创建对象

c# – 使用接口创建对象,第1张

概述在C#中,我们可以继承多个接口.在这种情况下,如果创建了一个对象,它只是隐藏属性或方法,还是编译器会避免创建和内存分配给其他接口的那些?例如,我有两个接口和一个类如下 interface IExample1 { void E1Test1(); void E1Test2(); } interface IExample2 { 在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上定义.然后投射到后者是没有意义的.

总结

以上是内存溢出为你收集整理的c# – 使用接口创建对象全部内容,希望文章能够帮你解决c# – 使用接口创建对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1224136.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存