无法从另一个类调用接口方法

本文关键字:调用 接口 方法 另一个 | 更新日期: 2023-09-27 18:34:39

下面是我的代码:

public interface I1
{
    void method1();
}
public interface I2
{
    void method1();
}
class MyClass
{
    static void Main(string[] args)
    {
        One one = new One();
    }
}
public class One :I1,I2
{
    void I1.method1()
    {
        Console.WriteLine("This is method1 from Interface 1");
    }
    void I2.method1()
    {
        Console.WriteLine("This is method1 from Interface 2");
    }
}

我有以下问题:

  1. 我无法在 1 类中将方法声明为 Public,因为这些是接口方法。
  2. 我无法从 Main 函数中的 MyClass 实例调用这些接口方法实现。

无法从另一个类调用接口方法

我无法在 1 类中将方法声明为 Public,因为这些是接口方法。

这只是因为您使用的是显式接口实现。假设你真的需要两种不同的实现,你可以让其中一个隐式:

public void method1()
{
    Console.WriteLine("This is method1 from Interface 1");
}
void I2.method1()
{
    Console.WriteLine("This is method1 from Interface 2");
}

请注意,现在我们如何指定public访问修饰符,one.method1()将调用该公共方法。显式接口实现仅允许通过编译时类型接口(而不是实现它的类(的表达式访问该方法。

我无法从 Main 函数中的 MyClass 实例调用这些接口方法实现。

同样,只是因为您使用的是显式接口实现,并且您的one变量的类型为 One

基本上你可以用以下命令调用这些方法:

One one = new One();
I1 i1 = one;
I2 i2 = one;
i1.method1();
i2.method1();

或者只是投射:

((I1)one).method1();
((I2)one).method1();

你有明确的接口实现。因此,您只能通过将实例转换为接口类型来访问您的方法

One one = new One();
I1 x = (I1)one;
x.method1();

请注意,除了在类 One 中显式分离实现两个接口方法之外,您还可以选择将两个接口实现到单个方法中,如果您不需要不同的实现,该方法将是公共的:

public class One : I1, I2
{
    public void method1()
    {
        Console.WriteLine("Combined");
    }
}

在这种情况下,所有 3 个变体都将调用相同的方法:

var x = new One();
x.method1();
I1 i1 = x;
i1.method1();
I2 i2 = x;
i2.method1();

这是我最喜欢的编程语言主题之一。之所以不可能,是因为像 C# 这样的语言不支持我们在 C 等语言中使用的多重继承,这是编译器识别正确超类成员的选择。C# 编译器的实现方式,如果我们不显式声明,它就不知道哪个成员是哪个成员。

如果我们被允许有多个同名的成员,那么就不可能知道哪个是哪个盒子。

这就像两个男人不知道哪个婴儿是他们的,除非进行基因测试,但我们没有明确地在 C# ;)

像其他同伴的回答一样,它是这样的:

One one = new One();
((I1)one).method1();
((I2)one).method1();

我们可以有一个使用一个接口的公众,如下所示:

public void method1()
{
    ((I1)this).method1();
}