gpt4 book ai didi

c# - 显式接口(interface)实现,为什么要显式转换

转载 作者:太空狗 更新时间:2023-10-29 20:50:14 25 4
gpt4 key购买 nike

当类显式实现接口(interface)时,为什么需要显式将类实例转换为接口(interface)才能使用已实现的方法?

(此示例取自此处:MSDN: Explicit Interface Implementation)

你有如下两个接口(interface)。

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");
}
}

现在,要使用您具有以下代码的接口(interface)。

// 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<string, string> c = new Dictionary<string, string>();

无需将 new Dictionary 显式转换为 IDictionary

谢谢。

最佳答案

When a class explicitly implements an interface why do you need to explicitly cast the class instance to interface in order to use implemented method?

就编译器而言,该成员实际上并不存在于类中 - 它存在于接口(interface)中。您不必显式转换 - 您只需要有一个具有接口(interface)的编译时类型的引用。这可以随心所欲地完成,包括隐式转换。

In the above code block, why do you have

IControl c = (IControl)obj;

as opposed to

IControl c = obj;

你不必。隐式转换应该绝对没问题。您必须显式转换才能在单个表达式中调用该方法,例如

obj.Paint(); // Invalid
((IControl) obj).Paint(); // Valid

但是,如果您通过分配给接口(interface)类型的单独局部变量来进行隐式转换,那很好 - 该方法仍在使用接口(interface)类型的目标表达式进行调用。

关于c# - 显式接口(interface)实现,为什么要显式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19816418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com