显式接口实现,为什么显式转换
当一个类显式实现一个接口时,为什么需要将类实例显式地转换为接口才能使用已实现的方法?
(此示例取自此处: MSDN:显式接口实现 )
您有两个接口,如下所示。
interface IControl { void Paint(); } interface ISurface { void Paint(); }
然后你明确地实现它们。
public class SampleClass : IControl, ISurface { void IControl.Paint() { System.Console.WriteLine("IControl.Paint"); } void ISurface.Paint() { System.Console.WriteLine("ISurface.Paint"); } }
现在,要使用这些接口,您需要以下代码。
// Call the Paint methods from Main. SampleClass obj = new SampleClass(); //obj.Paint(); // Compiler error. IControl c = (IControl)obj; c.Paint(); // Calls IControl.Paint on SampleClass. ISurface s = (ISurface)obj; s.Paint(); // Calls ISurface.Paint on SampleClass.
在上面的代码块中,为什么你有
IControl c = (IControl)obj;
而不是
IControl c = obj;
?
我混淆的原因是,例如,您可以执行以下操作
IDictionary c = new Dictionary();
没有明确地将new Dictionary
为IDictionary
。
谢谢。
当一个类显式实现一个接口时,为什么需要将类实例显式地转换为接口才能使用已实现的方法?
就编译器而言,该成员实际上不存在于类中 – 它仅存在于接口上。 您不必显式强制转换 – 您只需要具有编译时类型的接口的引用。 这可以随心所欲地完成,包括隐式转换。
在上面的代码块中,为什么你有
IControl c = (IControl)obj;
而不是
IControl c = obj;
你不必。 隐式转换应该绝对正确。 您必须显式转换才能在单个表达式中调用该方法,例如
obj.Paint(); // Invalid ((IControl) obj).Paint(); // Valid
但是如果你通过赋值给接口类型的单独局部变量进行隐式转换,那很好 – 该方法仍然使用目标表达式调用,该目标表达式是接口类型。
仅当类型从多个接口inheritance并且某些方法在多个接口中具有相同的名称/签名时,才需要显式接口实现。
rest是优先事项和惯例。
mpleClass obj = new SampleClass(); //obj.Paint(); // Compiler error.
obj.Paint()
– >这是错误,因为当显式接口实现完成时,底层接口实现需要在MSDN中指定的显式obj.Paint()
在方法调用,属性访问或索引器访问中,无法通过其完全限定名称访问显式接口成员实现。 显式接口成员实现只能通过接口实例访问,并且在这种情况下仅通过其成员名称引用。
上述就是C#学习教程:显式接口实现,为什么显式转换分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1015435.html