C#:interface:2个接口中的相同方法

时间:2011-07-10 05:46:03

标签: c# interface

我有2个接口,

    public interface I1
    {
       string GetRandomString();
    }

   public interface I2
   {
      string GetRandomString();
   }

在课堂上,我已植入两者,

    public class ClassA : I1, I2
    {

      string I1.GetRandomString()
      {
         return "GetReport I1";
      }

      string I2.GetRandomString()
      {
          return "GetReport I1";
       }

    }

现在在我要访问的main方法中,这些接口方法却无法

    static void Main(string[] args)
    {
        var objClassA = new ClassA();
        objClassA.GetRandomString(); // not able to do this, comile time error ... 
    }

我知道,我错过了一些基本的OOPS内容,只是想知道这一点。 任何帮助?

7 个答案:

答案 0 :(得分:4)

问题是这些函数不是MyClass的成员函数,因为它们是定义的,I1.GetRandomString是I2.GetRandomString。您只能在其中一个界面上调用它们:

    I1 objClassA = new ClassA();
    objClassA.GetRandomString();

    I2 objClassA = new ClassA();
    objClassA.GetRandomString();

答案 1 :(得分:4)

您可以将对象强制转换为所需的接口类型,然后调用该方法。

if (objClassA is I1)
{
    ((I1)objClassA).GetRandomString();
}
if (objClassA is I2)
{
    ((I2)objClassA).GetRandomString();
}

答案 2 :(得分:3)

如果您有时想要使用一个界面,有时甚至想要使用另一个界面,则可能需要在最后一个界面使用强制转换。如果您控制类型并且可以直接使用其中一个接口函数而不是显式实现,那么将避免对该类型进行强制转换的要求。为避免必须对任一函数进行类型转换,您应该在对象中以不同的名称使它们可用。因为在C#中任何实现anyInterface.Boz的方法都必须被称为Boz,最好的方法可能是让IFoo.Boz和IBar.Boz的实现简单地调用名为FooBoz和BarBoz的公共方法,然后可以直接调用它们歧义。

尽管对于接口来说,使用类很便宜,但结构可能很昂贵。在某些情况下,可以通过使用以下静态方法来避免此成本:

    public interface AliceFoo { void foo();};
    public interface BobFoo { void foo();};
    static void do_alice_foo<T>(ref T it) where T:AliceFoo
    {
        it.foo();
    }
    static void do_bob_foo<T>(ref T it) where T : BobFoo
    {
        it.foo();
    }

这种方法允许使用'foo'方法而无需对任何内容进行类型转换。

答案 3 :(得分:2)

您应该将对象转换为特定的接口类型。

static void Main(string[] args)
{
    var objClassA = new ClassA();

    I1 objClassAThreatedAsI1Interface = (I1)objClassA;
    objClassAThreatedAsI1Interface.GetRandomString();

    I2 objClassAThreatedAsI2Interface = (I2)objClassA;
    objClassAThreatedAsI2Interface.GetRandomString();
}

答案 4 :(得分:1)

您已明确实现了这些接口。因此,方法实现属于接口,而不是您定义的类型。就编译器而言,该方法不存在该类型。

您需要将您的实例显式地转换为您要调用的接口并调用该方法(正如其他人所示)。

或者更好的是,选择其中一个接口作为“主要”接口,并省略显式实现。

即,

public class ClassA : I1, I2
{
    // make I1's implementation the "main" one
    public string GetRandomString()
    {
        return "GetReport I1";
    }

    // I2's implementation could only be called via a reference to an I2
    string I2.GetRandomString()
    {
        return "GetReport I2";
    }

}

或者,只使用该方法的单个实现(并省略显式实现)。

答案 5 :(得分:0)

在ClassA中将您的两个GetRandomString方法标记为public。如果您未提供访问修饰符,则默认为private。

答案 6 :(得分:0)

您需要将对象转换为定义要调用的方法版本的接口。

如果您只想在类中定义单个版本的方法,请删除接口的显式定义(换句话说,从函数的第一个定义和完整的I2。*方法中删除I1。 )