加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用接口创建对象

发布时间:2020-12-15 19:28:54 所属栏目:百科 来源:网络整理
导读:在C#中,我们可以继承多个接口.在这种情况下,如果创建了一个对象,它只是隐藏属性或方法,还是编译器会避免创建和内存分配给其他接口的那些?例如,我有两个接口和一个类如下 interface IExample1 { void E1Test1(); void E1Test2(); } interface IExample2 { vo
在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上定义.然后投射到后者是没有意义的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读