为什么在混合显式实现和多态时我在C#中出错?

时间:2009-04-02 18:23:48

标签: c# .net design-patterns

我收到此错误:

  

类型Bar不实现接口IFoo

从这段代码:

public interface IFoo
{
   void DoA();

   void DoB();
}

public class Foo:IFoo
{

    void IFoo.DoA()
    {

    }

    void IFoo.DoB()
    {


   }
}

public class Bar:Foo
{

     void IFoo.DoA()
      {
          base.doA();

      }

      void IFoo.DoB()
      {
          base.doB();

      }
  }  

我正在使用C#2.0。

我做错了什么?

5 个答案:

答案 0 :(得分:3)

public class Bar : Foo, IFoo
{ 
    // Your code
}

答案 1 :(得分:2)

请参阅n8wrl's answer,了解应如何这样做。请参阅下文。

隐式实现接口时,您无法明确实现接口成员(void IFoo.DoA())。换句话说,因为Bar仅通过扩展IFoo来实现Foo,所以您不能使用显式实现。

这将有效:

public class Bar : Foo
{
    public void DoA()
    {
        ...
    }

    public void DoB()
    {
        ...
    }

或者这个:

public class Bar : Foo, IFoo
{
    void IFoo.DoA()
    {
        ...
    }

    void IFoo.DoB()
    {
        ...
    }

您可能面临的一个更大问题是,由于Foo不是抽象的,因此必须实施DoADoB。如果您在bar中实现这些方法,那么您将不会以多态方式执行此操作。如果代码具有Foo类型的句柄,您将hiding Bar个实现。

答案 2 :(得分:2)

我也遇到过这种情况。什么是'更糟',取决于你如何看待它是你不能定义接口实现虚拟在后代类中被覆盖。我养成了这样做的习惯:

public class Foo:IFoo
{    
     void IFoo.DoA()
     {
          DoACore();
     }
     void IFoo.DoB()
     {
          DoBCore();
     }
     protected virtual void DoACore()
     {
     }
     protected virtual void DoBCore()
     {
     }
}
public class Bar:Foo
{     protected override void DoACore()
      {
          base.DoACore();
      }
      protected override void DoBCore()
      {
          base.DoBCore();
      }
}

答案 3 :(得分:1)

我怀疑是否会出现关于如何在C ++中实现接口的混淆,如抽象类和多重继承。

在.NET中,界面只是一个合同,表示你将实现这些方法。

您的代码将无法编译,因为此代码不会编译(与C ++一样):

public interface IFoo
{
    void DoSomething();
}

public abstract class Foo : IFoo
{
}

Foo声明Foo实现了IFoo,它没有说任何关于任何人的事情。

如果你想强制派生类来实现它,你可以这样做:

public interface IFoo
{
    void DoSomething();
}

public abstract class Foo : IFoo
{
    public abstract void DoSomething();
}

或者如果你真的想要通过显式实现隐藏接口方法,那么就像上面发布的n8wrl一样。

答案 4 :(得分:1)

首先,目前尚不清楚任务是什么?如果目标是尽快解决问题,那么“Bar:Foo,IFoo”是最短的解决方案。

如果您只是想学习'隐式/显式'接口差异,请检查此post

另请注意,“n8wrl”解决方案是有争议的。只有当Foo确实需要明确地实现IFoo时才可以。如果不是,那么有一种更简单的方法:

public interface IFoo
{
    void DoA();
}

public class Foo : IFoo
{
    public virtual void DoA() {}
}

public class Bar : Foo
{
    public override void DoA() {}
}

希望这有帮助。