C#与功能范围的接口问题

时间:2013-06-20 08:11:06

标签: c# interface

我有一个如下界面:

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,然后我可以成功编译,即使其他方法(此处未列出)已明确实现,但我不确定这是什么含义。

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

谢谢!

4 个答案:

答案 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);
}