Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法从其他类调用接口方法_C#_Oop - Fatal编程技术网

C# 无法从其他类调用接口方法

C# 无法从其他类调用接口方法,c#,oop,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() {

下面是我的代码:

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中将方法声明为Public,因为它们是接口方法
  • 我无法从主函数中的MyClass实例调用这些接口方法实现

  • 您有显式的接口实现。因此,您只能通过将实例强制转换为接口类型来访问方法

    One one = new One();
    I1 x = (I1)one;
    x.method1();
    
    我无法在类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
    access修饰符,并且
    one.method1()
    将调用该public方法。显式接口实现只允许通过编译时类型为接口(而不是实现接口的类)的表达式访问方法

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

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

    基本上,您可以使用以下方法调用这些方法:

    One one = new One();
    I1 i1 = one;
    I2 i2 = one;
    i1.method1();
    i2.method1();
    
    或者只是演员:

    ((I1)one).method1();
    ((I2)one).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();
    }
    
    我们可以有一个public,它使用这样一个接口:

    One one = new One();
    ((I1)one).method1();
    ((I2)one).method1();
    
    public void method1()
    {
        ((I1)this).method1();
    }
    

    此线程可能很有用:感谢Jon的详细解释。我认为method1()是在最后一行中使用的,而不是method2();)