我有一个如下界面:
public interface IInterface
{
void Open();
void Open(bool flag);
void Open(bool flag, bool otherFlag);
}
现在实现界面时,我有以下内容:
public class IClass : IInterface
{
void IInterface.Open()
{
Open(false, false);
}
void IInterface.Open(bool flag)
{
Open(flag, false);
}
void IInterface.Open(bool flag, bool otherFlag)
{
//Do some stuff
}
}
现在,我遇到的问题是在IClass的前两个函数体中,我无法调用第三个函数。我收到错误:
当前上下文中不存在“打开”名称
好的,所以我明确地实现了界面(由于组织中另一个团队的要求),然后我得到了“开放”上下文问题。 我可以从三个open方法中删除显式的IInterface,然后我可以成功编译,即使其他方法(此处未列出)已明确实现,但我不确定这是什么含义。
有没有办法在显式实现接口方法时调用第三个方法?
谢谢!
答案 0 :(得分:7)
显式实现需要直接使用接口类型的引用,即使在实现类中也是如此:
void IInterface.Open()
{
(this as IInterface).Open(false, false);
}
void IInterface.Open(bool flag)
{
(this as IInterface).Open(flag, false);
}
保留显式实现的另一种方法是将调用委托给私有方法:
private void Open(bool flag, bool otherFlag)
{
// Do some stuff.
}
您的通话现在将映射到此方法:
void IInterface.Open()
{
Open(false, false);
}
void IInterface.Open(bool flag)
{
Open(flag, false);
}
void IInterface.Open(bool flag, bool otherFlag)
{
Open(true, true);
}
另请注意,您的班级名称违反惯例,请删除I
前缀。
答案 1 :(得分:3)
你可以这样做:
((IInterface)this).Open(false, false);
您可能会考虑的一件事是在IInterface
上制作其他重载扩展方法,而不是每次都重新实现它们:
public static void Open(this IInterface iface, bool flag)
{
iface.Open(flag, false);
}
答案 2 :(得分:1)
请确保首先将this
对象显式地作为接口处理:
void IInterface.Open(bool flag)
{
((IInterface)this).Open(flag, false);
}
答案 3 :(得分:1)
void IInterface.Open()
{
(this as IInterface).Open(false, false);
}