web-dev-qa-db-fra.com

Héritage de plusieurs interfaces avec le même nom de méthode

Si nous avons une classe qui hérite de plusieurs interfaces et que les interfaces ont des méthodes portant le même nom, comment pouvons-nous implémenter ces méthodes dans ma classe? Comment pouvons-nous spécifier quelle méthode de quelle interface est implémentée?

60
masoud ramezani

En implémentant l'interface explicitement, comme ceci:

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");
    }
}

Lors de l'utilisation d'implémentations d'interface explicites, les fonctions ne sont pas publiques sur la classe. Par conséquent, pour accéder à ces fonctions, vous devez d'abord convertir l'objet en type d'interface ou l'affecter à une variable déclarée du type d'interface.

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();
86
Pete
10
Gopher

Vous pouvez implémenter une ou les deux interfaces explicitement .

Dites que vous avez ces interfaces:

public interface IFoo1
{
    void DoStuff();
}

public interface IFoo2
{
    void DoStuff();
}

Vous pouvez implémenter les deux comme ceci:

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

    void IFoo2.DoStuff() { }        
}
8
Mark Seemann

Parfois, vous pouvez même avoir besoin de faire:

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

    public void IFoo2.DoStuff()
    {
        ((IFoo1)this).DoStuff();
    }        
}
3
Sebastian

Vous pouvez implémenter une interface de manière explicite et une autre implicitement .

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

ITest.Test sera l'implémentation par défaut.

Dual dual = new Dual();
dual.Test();
((ITest2)dual).Test();

Sortie:

Console.WriteLine("ITest.Test");
Console.WriteLine("ITest2.Test");
2
Bimal Das
public interface IDemo1
{
 void Test();
}
public interface IDemo2
{
 void Test();
}
public class clsDerived:IDemo1,IDemo2
{
  void IDemo1.Test() 
  {
   Console.WriteLine("IDemo1 Test is fine");
  }
 void IDemo2.Test() 
  {
    Console.WriteLine("IDemo2 Test is fine");
  }
}

public void get_methodes()
{
    IDemo1 obj1 = new clsDerived();
    IDemo2 obj2 = new clsDerived();
    obj1.Test();//Methode of 1st Interface
    obj2.Test();//Methode of 2st Interface
}
2
Ranajit kumar
public class ImplementingClass : AClass1, IClass1, IClass2

    {
        public override string Method()
        {
            return "AClass1";
        }
        string IClass1.Method()
        {
            return "IClass1";
        }
         string IClass2.Method()
        {
            return "IClass2";
        }
    }

Ainsi, lorsque vous appelez d'une classe différente, vous devrez transtyper l'objet en classe d'interface ou abstraite requise.

ImplementingClass implementingClass = new ImplementingClass();
((AClass1)implementingClass).Method();
1
Rohit.P

La réponse est " En utilisant une implémentation d'interface explicite "

Prenons un exemple:

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();
    }

}

Sortie: Bonjour à tous-A Bonjour à tous-B

0
Vinayak Savale