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

本文关键字:方法 接口 两个 interface | 更新日期: 2023-09-27 18:01:35

我有两个接口,

    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";
       }
    }

现在在主方法中我想访问这些接口方法但是不能

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

我知道,我错过了一些基本的oop的东西,只是想知道。有人帮忙吗?

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

如果您有时想要使用一个接口,有时想要使用另一个接口,那么很可能需要对其中一个接口使用强制类型转换。如果您控制类型,并且可以让其中一个接口函数直接可用,而不是作为显式实现,那么将避免对该接口函数进行强制类型转换的需求。为了避免必须对这两个函数进行类型转换,您应该在对象中以不同的名称提供它们。因为在c#中任何方法都实现了anyInterface。Boz必须被称为Boz,最好的方法可能是实现IFoo。博斯和伊巴。Boz只需调用名为FooBoz和BarBoz的公共方法,然后可以"直接"调用,而不会产生歧义。

虽然转换到接口对于类来说成本很低,但是对于结构体来说可能会很昂贵。在某些情况下,可以通过使用如下静态方法来避免此开销:

<>之前公共接口AliceFoo{无效foo();};公共接口BobFoo {void foo();};静态void do_alice_foo_ (ref T it) where T: alice_foo_{it.foo ();}静态void do_bob_foo(ref T it) where T: bob_foo{it.foo ();}之前

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

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

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

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

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

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

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

static void Main(string[] args)
{
    var objClassA = new ClassA();
    I1 objClassAThreatedAsI1Interface = (I1)objClassA;
    objClassAThreatedAsI1Interface.GetRandomString();
    I2 objClassAThreatedAsI2Interface = (I2)objClassA;
    objClassAThreatedAsI2Interface.GetRandomString();
}

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

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

或者更好,选择其中一个接口作为"主"接口,而省略显式实现。

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";
    }
}

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

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

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

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

using System;
namespace demo
{
    public interface I1
    {
        string GetRandomString();
    }
    public interface I2
    {
        string GetRandomString();
    }
    public class ClassA : I1, I2
    {
        
        public string GetRandomString()
        {
            return "GetReport I1";
        }
        
        string I2.GetRandomString()
        {
            return "GetReport I2";
        }
        public static void Main()
        {
            I1 objClassA = new ClassA();
            objClassA.GetRandomString();
           //I2 objClassA = new ClassA();
           // objClassA.GetRandomString();
        }
    }
}
相关文章: