4

我有一个如下界面:

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 的前两个函数体内,我不能调用第三个函数。我得到错误:

当前上下文中不存在名称“打开”

好的,所以我明确地实现了接口(由于组织中另一个团队的要求),然后我得到了“开放”上下文问题。我可以从三个打开的​​方法中删除显式 IInterface,然后我可以成功编译,即使其他方法(此处未列出)显式实现,但我不确定这意味着什么。

有没有办法在显式实现接口方法时调用第三种方法?

谢谢!

4

4 回答 4

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前缀。

于 2013-06-20T08:14:50.330 回答
3

你可以做:

((IInterface)this).Open(false, false);

您可能会考虑的一件事是制作其他重载扩展方法,IInterface而不是每次都重新实现它们:

public static void Open(this IInterface iface, bool flag)
{
    iface.Open(flag, false);
}
于 2013-06-20T08:14:14.037 回答
1

只需确保您首先将this对象明确地视为接口:

void IInterface.Open(bool flag)
{
   ((IInterface)this).Open(flag, false);
}
于 2013-06-20T08:14:58.117 回答
1
void IInterface.Open()   
{      
    (this as IInterface).Open(false, false);
}
于 2013-06-20T08:15:03.237 回答