在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 ...
)时,在内存中始终存在该类的完整实例。没有接口实例这样的东西。
另一侧的接口只是该实例的某种视图。因此,在您的示例中,您的实例上存在四种方法。但是,您可能会或可能不会从类型或的引用访问这些方法。例如,尽管基础实例确实具有此方法,但是您不能使用type的引用:IExample1
IExample2
E2Test1
IExample1
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] 删除。
我来说两句