Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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#_Inheritance_Methods_Interface_Multiple Inheritance - Fatal编程技术网

C# 从具有相同方法名称的多个接口继承

C# 从具有相同方法名称的多个接口继承,c#,inheritance,methods,interface,multiple-inheritance,C#,Inheritance,Methods,Interface,Multiple Inheritance,如果我们有一个从多个接口继承的类,并且这些接口有同名的方法,我们如何在我的类中实现这些方法?我们如何指定实现哪种接口的方法?您必须使用您可以实现其中一个或两个接口 假设您有以下接口: public interface IFoo1 { void DoStuff(); } public interface IFoo2 { void DoStuff(); } 您可以这样实现这两个功能: public class Foo : IFoo1, IFoo2 { void IFoo1

如果我们有一个从多个接口继承的类,并且这些接口有同名的方法,我们如何在我的类中实现这些方法?我们如何指定实现哪种接口的方法?

您必须使用您可以实现其中一个或两个接口

假设您有以下接口:

public interface IFoo1
{
    void DoStuff();
}

public interface IFoo2
{
    void DoStuff();
}
您可以这样实现这两个功能:

public class Foo : IFoo1, IFoo2
{
    void IFoo1.DoStuff() { }

    void IFoo2.DoStuff() { }        
}
public interface ITest {
    void Test();
}
public interface ITest2 {
    void Test();
}
public class Dual : ITest, ITest2
{
    void ITest.Test() {
        Console.WriteLine("ITest.Test");
    }
    void ITest2.Test() {
        Console.WriteLine("ITest2.Test");
    }
}

通过显式实现接口,如下所示:

public class Foo : IFoo1, IFoo2
{
    void IFoo1.DoStuff() { }

    void IFoo2.DoStuff() { }        
}
public interface ITest {
    void Test();
}
public interface ITest2 {
    void Test();
}
public class Dual : ITest, ITest2
{
    void ITest.Test() {
        Console.WriteLine("ITest.Test");
    }
    void ITest2.Test() {
        Console.WriteLine("ITest2.Test");
    }
}
使用显式接口实现时,函数在类上不是公共的。因此,为了访问这些函数,必须首先将对象强制转换为接口类型,或将其分配给声明为接口类型的变量

var dual = new Dual();
// Call the ITest.Test() function by first assigning to an explicitly typed variable
ITest test = dual;
test.Test();
// Call the ITest2.Test() function by using a type cast.
((ITest2)dual).Test();

有时您甚至需要执行以下操作:

public class Foo : IFoo1, IFoo2
{
    public void IFoo1.DoStuff() { }

    public void IFoo2.DoStuff()
    {
        ((IFoo1)this).DoStuff();
    }        
}
因此,当从不同的类调用时,必须将对象类型转换为所需的接口或抽象类

ImplementingClass implementingClass = new ImplementingClass();
((AClass1)implementingClass).Method();
您可以显式地实现一个接口,而显式地实现另一个接口

ITest.Test
将是默认实现。

Dual dual = new Dual();
dual.Test();
((ITest2)dual).Test();
输出:

Console.WriteLine("ITest.Test");
Console.WriteLine("ITest2.Test");
答案是“

举一个例子:

using System;

interface A

{
        void Hello();
}

interface B

{
    void Hello();
}


class Test : A, B

{
    void A.Hello()

    {
        Console.WriteLine("Hello to all-A");
    }

    void B.Hello()
    {
        Console.WriteLine("Hello to all-B");

    }

}

public class interfacetest

{
    public static void Main()

    {
        A Obj1 = new Test();

        Obj1.Hello();

        B Obj2 = new Test();

        Obj2.Hello();
    }

}
输出: 大家好
您好,all-B

与创建正确接口类型的临时接口相比?不用了,谢谢<代码>只读IFoo1 this1=this;这是1.DoStuff()在显式接口实现中包含代码的可继承类通常会给派生类带来麻烦。我建议另一种模式是使用
protected
方法为两个接口成员编写代码,并将两个接口成员链接到该方法。将此转换为接口类型以使用其成员通常是一种重要的代码气味。最好有一个
受保护的
方法来实现所讨论的成员并链接到该成员。如果Test()在接口和双类中都声明为public会怎么样?接口上的方法/属性始终是public的-这就是接口的整个点。但是,当您使用显式接口实现时,函数在类上始终是私有的。这就是为什么需要将类强制转换为所需的特定接口的技术。当您实现两个定义具有相同签名的方法的接口时,您无法避免这一点。请注意,这其中的另一个微妙“特征”是,即使每个方法具有相同的方法签名,它们也可以具有不同的返回类型。如果除了其中一个方法外,您没有对所有或所有方法使用显式接口声明,这通常是不允许的。@R.S.K如果Test()在Dual类中声明,则两个接口都将使用它作为实现。您将无法同时使用其他两个显式实现。
using System;

interface A

{
        void Hello();
}

interface B

{
    void Hello();
}


class Test : A, B

{
    void A.Hello()

    {
        Console.WriteLine("Hello to all-A");
    }

    void B.Hello()
    {
        Console.WriteLine("Hello to all-B");

    }

}

public class interfacetest

{
    public static void Main()

    {
        A Obj1 = new Test();

        Obj1.Hello();

        B Obj2 = new Test();

        Obj2.Hello();
    }

}