【问题标题】:Unable to call Interface methods from another class无法从另一个类调用接口方法
【发布时间】:2014-12-19 12:09:19
【问题描述】:

下面是我的代码:

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,因为这些是接口方法。
  2. 我无法从 Main 函数中的 MyClass 实例调用这些接口方法实现。

【问题讨论】:

标签: c# oop


【解决方案1】:

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

那只是因为您使用的是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 实例调用这些接口方法实现。

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

基本上你可以调用方法:

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

或者只是投射:

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

【讨论】:

  • 感谢 Jon 的详细解释。
  • 我认为 method1() 是在最后一行而不是 method2() ;)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      这就像两个男人不知道哪个孩子是他们的,除非我们在 C# 上进行基因测试;)

      和其他人的回答一样是这样的:

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

      我们可以让一个公众使用这样一个接口:

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

      【讨论】:

        猜你喜欢
        • 2012-04-30
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 2017-09-28
        • 1970-01-01
        相关资源
        最近更新 更多