使用界面创建对象

巴拉德瓦伊

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();

编译器是否会为两个接口(包括所有方法)创建完整的对象,并为一个没有访问权限的对象隐藏它?还是仅使用适用于特定接口的方法创建?

HimBromBeere

当您使用类的构造函数实例化一个类(使用后new ...时,在内存中始终存在该类的完整实例。没有接口实例这样的东西。

另一侧的接口只是该实例的某种视图因此,在您的示例中,您的实例上存在四种方法但是,您可能会或可能不会从类型引用访问这些方法例如,尽管基础实例确实具有此方法,但是您不能使用type引用IExample1IExample2E2Test1IExample1

IExample1 i1 = new Example();

现在调用i1.E1Test1()可以编译,而i1.E2Test1()不能编译,因为该方法是在另一个接口上定义的。然而,你可以简单地把实例引用i1其他接口和访问该成员是这样的:

IExample i2 = (IExample2) i1;
i2.E2Test1();

从TimSchmelters开始的EDIT注释:如果您的Example-class仅实现IExample1而不是另一个接口强制转换为该接口,则肯定会失败并InvalidCastException在运行时产生一个因此,在这种情况下,Example-class实例将仅在上定义成员IExample1,而不在上定义成员IExample2那么,对后者进行强制转换就没有意义了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章