C#:接口:在两个接口中使用相同的方法

C#:接口:在两个接口中使用相同的方法,c#,interface,C#,Interface,我有两个接口 public interface I1 { string GetRandomString(); } public interface I2 { string GetRandomString(); } 在一节课上,我植入了 public class ClassA : I1, I2 { string I1.GetRandomString() { retur

我有两个接口

    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东西,只是想知道。
有什么帮助吗

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

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

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

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

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

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

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

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

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

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

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

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


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

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


您需要将对象强制转换到定义要调用的方法版本的接口


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

您需要将对象强制转换到定义要调用的方法版本的接口


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

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

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

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

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

您已经显式地实现了接口。因此,方法实现属于接口,而不是您定义的类型。就编译器而言,该类型的方法不存在

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

或者更好,选择其中一个接口作为“主”接口,而不使用显式实现

i、 e


或者,只使用该方法的单个实现(而不使用显式实现)。

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

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

或者更好,选择其中一个接口作为“主”接口,而不使用显式实现

i、 e


或者,只使用该方法的一个实现(而不使用显式实现)。

如果有时需要使用一个接口,有时需要使用另一个接口,则可能需要对其中的最后一个接口使用强制转换。如果您控制类型,并且可以使其中一个接口函数直接可用,而不是作为显式实现,那么将避免对该接口函数进行强制转换的要求。为了避免对任一函数进行类型转换,您应该在对象中以单独的名称使它们可用。因为在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(); } 公共接口AliceFoo{void foo();}; 公共接口BobFoo{void foo();}; 静态void do_alice_foo(ref T it),其中T:AliceFoo { it.foo(); } 静态void do_bob_foo(ref T it),其中T:BobFoo { it.foo(); }
这种方法允许使用“foo”方法,而不必进行任何类型转换。

如果有时需要使用一个接口,有时需要使用另一个接口,则可能需要对其中的最后一个接口进行转换。如果您控制类型,并且可以使其中一个接口函数直接可用,而不是作为显式实现,那么将避免对该接口函数进行强制转换的要求。为了避免对任一函数进行类型转换,您应该在对象中以单独的名称使它们可用。因为在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(); } 公共接口AliceFoo{void foo();}; 公共接口BobFoo{void foo();}; 静态void do_alice_foo(ref T it),其中T:AliceFoo { it.foo(); } 静态void do_bob_foo(ref T it),其中T:BobFoo { it.foo(); }
这种方法允许使用“foo”方法,而不必进行任何类型转换。

不能使用访问修饰符进行显式接口实现。而且不可能对具有相同签名方法的两个不同接口使用隐式实现,否则两个接口将使用相同的实现