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?
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();
Vous devez utiliser implémentation d'interface explicite
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() { }
}
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();
}
}
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");
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
}
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();
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