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

时间:2014-12-19 12:09:20

标签: c# oop

以下是我的代码:

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. 我无法在类One中将方法声明为Public,因为这些是Interface方法。
  2. 我无法在Main函数中调用MyClass实例中的这些Interface方法实现。

4 个答案:

答案 0 :(得分:6)

  

我无法在类One中将方法声明为Public,因为它们是Interface方法。

这只是因为你正在使用explicit interface implementation。假设您确实需要两个不同的实现,您可以隐式地使一个

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实例中的这些Interface方法实现。

同样,仅因为您使用显式接口实现而one变量的类型为One

基本上你可以用以下方法调用方法:

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

或者只是演员:

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

答案 1 :(得分:2)

您有明确的接口实现。因此,您只能通过将实例强制转换为接口类型

来访问您的方法
One one = new One();
I1 x = (I1)one;
x.method1();

答案 2 :(得分:1)

请注意,除了在类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();

答案 3 :(得分:1)

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

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

就像2个男人不知道哪个孩子是他们的,除非进行基因测试我们还没有明确地使用C#;)

和其他答案一样,就是这样:

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

我们可以让一个公共使用一个这样的界面:

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