2010-03-03 7 views

Répondre

74

En mettant en œuvre 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"); 
    } 
} 

Lorsque vous utilisez 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(); 
+0

si Test() est déclarée public dans les deux interfaces et la double classe? –

+5

Les méthodes/propriétés d'une interface sont toujours publiques, c'est-à-dire le point entier d'une interface. Mais lorsque vous utilisez une implémentation d'interface explicite, la fonction sera toujours privée sur la classe. C'est pourquoi vous avez besoin de la technique pour transformer la classe en l'interface spécifique dont vous avez besoin. Lorsque vous implémentez deux interfaces qui définissent des méthodes avec une signature identique, vous ne pouvez pas éviter cela. – Pete

+0

Notez qu'une autre "caractéristique" subtile de ceci est que chaque méthode peut avoir un type de retour différent même s'ils ont la même signature de méthode. Si vous n'utilisez pas de déclaration d'interface explicite sur toutes ou toutes les méthodes sauf une, cela n'est normalement pas autorisé. – NightOwl888

6

Vous pouvez mettre en œuvre un ou les deux de ces interfaces explicitly.

Dites que vous avez ces interfaces:

public interface IFoo1 
{ 
    void DoStuff(); 
} 

public interface IFoo2 
{ 
    void DoStuff(); 
} 

Vous pouvez mettre en œuvre à la fois comme ceci:

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

    void IFoo2.DoStuff() { }   
} 
3

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

Par rapport à la création temporaire d'un type d'interface correct? Non merci. 'readonly IFoo1 this1 = ceci; this1.DoStuff(); ' –

+3

Les classes héritables qui incluent du code dans les implémentations d'interface explicites provoquent souvent des problèmes pour les classes dérivées. Je suggérerais comme un modèle alternatif ayant une méthode «protégée» avec le code pour les deux membres d'interface, et ayant les deux membres d'interface en chaîne à cela. Couler 'this' à un type d'interface dans le but d'utiliser un membre de celui-ci est généralement une odeur de code significative. Mieux vaut avoir une méthode «protégée» qui implémente le membre en question et enchaîne à cela. – supercat

1
public class ImplementingClass : AClass1, IClass1, IClass2 

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

Donc lorsque vous appelez de différentes classes, vous devrez taper jeter l'objet dans l'interface requise ou classe abstraite.

ImplementingClass implementingClass = new ImplementingClass(); 
((AClass1)implementingClass).Method(); 
1
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 
} 
0

Vous pouvez implémenter une interface Explicitement et une autre implecitely.

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 la mise en œuvre par défaut .

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

Sortie:

Console.WriteLine("ITest.Test"); 
Console.WriteLine("ITest2.Test"); 
Questions connexes